2011-11-02 10 views
21

Duplicar posible:
What is the tilde (~) in a C# enumeration?¿Qué significa la tilde en una expresión?

me encontré con el siguiente fragmento de código en una página this MSDN.

(((Width * Planes * BitCount + 31) & ~31)/8) * abs(Height) 

Esto en efecto, compilar en C# Visual Studio 2010. ¿Qué es exactamente la tilde "~" hacer frente al número 31? Nunca antes había visto esta sintaxis en una expresión.

+2

Es el complemento bit a bit. Vea el enlace a continuación. [¿Cómo funciona el trabajo del operador AND bit a bit del complemento] [1] [1]: Para http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

futuro ref aquí está la lista de operadores C#. [Operadores de C#] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

Respuesta

5

Es el bitwise complement operator.

Básicamente, se voltea los bits:

0xffff0000 == ~0x0000ffff 

En el código que has publicado, haciendo & ~31 asegura los últimos 5 bits son 0 (bit a bit y del complemento de 11111, que es 00000).

36

~ - bitwise NOT operator, básicamente invertir los bits

31 en formato binario es 11111, por lo ~ 31 == 00000, básicamente 0

+0

+1 ya que es la respuesta más fácil de entender y clara. –

+5

El ejemplo no es correcto, porque el cero inicial también se invierte. Es decir. '~ 31 = ~ 0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

este ejemplo no es correcto El complemento binario de 31's es 00000000000000000000000000011111 (que es 0000001F en Hex - si se calcula 32bit) y el operador" ~ "invierte los bits, por lo que la respuesta será 11111111111111111111111111100000 , si convertimos esto a decimal, la respuesta es -32 Si el complemento de dos en dos de 64 bits es el 0000000000000000000000000000000000000000000000000000000000011111 y "~" voltea los bits, lo que equivale de nuevo a -32. AFAIK no hay una PC de 6 bits que ejecute C# por lo que la suya es incorrecta. Si hay una PC de 6 bits, esto es correcto. –

1

Este es el operador de bits complemento - sólo hace que todos los bits 0 a 1s y viceversa ... ver MSDN reference.

En su caso específico sólo crea (31 = 0x1F):

~0x1F = 0xFFFFFFE0 

Se utiliza con el bitwise and (&) y por lo tanto Bascially anula los últimos 5 bits.

0
~ 31

= bit a bit negación de 31 y en este caso particular, se utiliza para mantener a cero los primeros (de LSB) 5 bits de (Width * Planes * BitCount + 31)

7

Se gira a la copia a mano de ISO/IEC 23270:2006 — Information technology — Programming languages — C# y gire a § 14.6. 4 de la santa escritura. Allí encontrará:


14.6.4 bit a bit operador de complemento

Para una operación de la forma se aplica ~ x, la resolución de la sobrecarga de operador unitario (§14.2.3) para seleccionar un operador específico implementación. El operando se convierte al tipo de parámetro del operador seleccionado, y el tipo de resultado es el tipo de retorno del operador. Los operadores bit a bit del complemento predefinidos son:

int operator ~(int x) ; 
uint operator ~(uint x) ; 
long operator ~(long x) ; 
ulong operator ~(ulong x) ; 

Para cada uno de estos operadores, el resultado de la operación es el complemento bit a bit de x.

Cada tipo de enumeración E proporciona implícitamente el siguiente operador de bits complemento:

E operator ~(E x); 

El resultado de la evaluación ~x, donde x es una expresión de un tipo de enumeración E con un tipo subyacente U, es exactamente el mismo que evaluando unchecked((E)(~(U)x)). Este operador solo es considerado por la resolución de sobrecarga del operador unario cuando el tipo de operando es el tipo de enumeración E (§14.2.3).

Las formas elevadas (§14.2.7) de los operadores de complemento a nivel de bits predefinidos no definidos definidos anteriormente también están predefinidas.


En su caso ~31 es lo mismo que ~ 0x0000001F. El complemento bit a bit de 0x0000001F es 0xFFFFFFE0. Por qué no solo escribieron la máscara real que querían está más allá de mí.

Cuestiones relacionadas