2011-08-04 8 views
75

En las líneas siguientes:lo hace | = (solo tubo iguales) y Y = (signo único iguales) significa

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly; 
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly; 


Folder.Attributes |= ~FileAttributes.System; 
Folder.Attributes &= ~FileAttributes.System; 

¿Qué significa |= (solo tubo iguales) y &= (solo carácter & iguales) en C#
Quiero quitar atributo del sistema con el mantenimiento de los otros ...

+0

he tratado de hacer que la versión de mi propia ficticia (caigo en ese grupo) de este a http://www.shrinkrays.net/articles/csharp-bit-manipulation- by-example.aspx. ~ es un NOT o el inverso de FileAttributes.System –

+0

@Chris S: gracias por el enlace/nice – MoonLight

Respuesta

103

Son compound assignment operadores, traduciendo (muy libremente)

x |= y; 

en

x = x | y; 

y lo mismo para &. Hay un poco más de detalle en algunos casos con respecto a un elenco implícito, y la variable objetivo solo se evalúa una vez, pero eso es básicamente lo esencial.

En términos de operadores no compuestos, & is a bitwise "AND" y | is a bitwise "OR".

EDITAR: En este caso desea Folder.Attributes &= ~FileAttributes.System. Para entender por qué:

  • ~FileAttributes.System significa "todos los atributos exceptoSystem" (~ es un bit a bit-NO)
  • & significa "el resultado es todos los atributos que se producen en ambos lados del operando"

Por lo tanto, básicamente actúa como una máscara - solo conserva los atributos que aparecen en ("todo excepto el sistema"). En general:

  • |= solamente siempre añadirá bits para el objetivo
  • &= solamente siempre eliminará bits del objetivo
+1

'x = x | (y); 'es una mejor manera de describirlo porque' x | = y + z; 'no es lo mismo que' x = x | y + z; ' – IronMensan

+0

gracias por las respuestas/pero para mi propósito (eliminar el atributo del sistema) ¿cuál debo usar (| = o & =)? – MoonLight

+1

@LostLord: 'Folder.Attributes & = ~ FileAttributes.System;' –

27

a |= b es equivalente a a = a | b excepto que a se evalúa sólo una vez
a &= b es equivalente a a = a & b excepto que a se evalúa sólo una vez

el fin de eliminar el bit de sistema sin cambiar otros bits, utilice

Folder.Attributes &= ~FileAttributes.System; 

~ es la negación a nivel de bits. Así establecerá todos los bits a 1, excepto el bit del sistema.and -ing con la máscara será configurar el sistema en 0 y dejar todos los demás bits intacta porque 0 & x = 0 y 1 & x = x para cualquier x

3

Quiero quitar atributo del sistema con el mantenimiento de los otros ..

Usted puede hacerlo de esta manera:

Folder.Attributes ^= FileAttributes.System; 
+1

Creo que desea usar un XOR en lugar de un AND para esto. – GameZelda

+0

un poco confundido/~ es necesario o no – MoonLight

+0

@LostLord: ¡Ciertamente lo es! Ver mi respuesta para la explicación –

Cuestiones relacionadas