2010-07-06 26 views

Respuesta

36

Es negación bit a bit. Esto significa que realiza el operador NOT binario en cada bit de un número. Por ejemplo:

int x = 15; // Binary: 00000000 00000000 00000000 00001111 
int y = ~x; // Binary: 11111111 11111111 11111111 11110000 

Cuando se combina con el operador & se utiliza para la limpieza de bits. Por lo tanto, en su ejemplo, significa que los últimos 3 bits del resultado de var2+7 se establecen en ceros.

Como se señala en los comentarios, también se utiliza para denotar destructores, pero ese no es el caso en su ejemplo.

+8

+1 Para una respuesta correcta. Solo quería señalar que '~' también se usa para nombrar destructores. – ereOn

+1

Y generalmente se usa para formar máscaras de bits. –

+0

Muchas gracias. Usted aclaró eso muy bien para mí. – Swiss

2

7 en binario es 00000111, entonces ~ 7 es 11111000 (suponiendo un byte de ocho bits). El autor del código lo está usando para enmascaramiento de bits.

+3

Puede que no sea un enmascaramiento de bits; podría estar redondeando al 8 más cercano (por alguna razón). – corsiKa

+0

Eso no es solo asumir un byte de ocho bits, sino un 'int' de 1 byte, lo cual es una suposición incorrecta para cualquier estándar que compile el compilador C. – sepp2k

+2

Supongo que solo quería evitar escribir demasiados dígitos binarios y explicar al mismo tiempo, por ejemplo, la operación no.Sin embargo, puede existir un byte de no-ocho bits, por lo que solo está especificando que el ejemplo se hace en un byte, y que el byte tiene 8 bits. – ShinTakezou

3

Es un NO bit a bit. No debe confundirse con el lógico no (¡que es!), Que cambia el valor lógico (verdadero a falso y viceversa). Este operador voltea cada bit en una variable.

4

Este código redondea var1 al número n * 8 más cercano. & ~ 7 establece los últimos 3 bits en 0, redondeando a 8 * n.

1

El efecto del código, como se señaló, es redondear un valor al siguiente múltiplo más alto de ocho. Mi formulación preferida sería "var1 = (var2 | 7) +1;" pero para entender la expresión tal como está escrito, es más útil para entenderlo desde afuera hacia adentro.

Aunque "&" y "~" son operadores distintos, con diferentes reglas de priorización, el concepto de "a = b & ~ c ; " es útil y en un sentido muy real merece su propio operador (permitiría reglas de promoción enteras más sensatas, entre otras cosas). Básicamente, "a = b & ~ c;" sirve para cancelar cualquier bit en 'b' que también esté en 'c' (si 'b' es largo y 'c' no, debido a las reglas de promoción de enteros, también cancelará bits más altos). Si 'c' es 2^N-1, la expresión cancelará los N bits inferiores, lo que equivale a redondear al siguiente múltiplo de 2^N.

La expresión tal como está escrita agrega 7 a var2 antes de redondear el resultado al siguiente múltiplo de 8. Si var2 era un múltiplo de 8, agregar 7 no alcanzará el siguiente múltiplo más alto de 8, pero de lo contrario lo hará . Por lo tanto, la expresión como un todo redondeará al siguiente múltiplo de 8.

Por cierto, mi formulación preferida redondea el número hasta el siguiente valor más alto que es poco menos que un múltiplo de 8, y luego lo supera hasta el siguiente múltiplo Evita la repetición del número mágico "7", y en algunos conjuntos de instrucciones, el enfoque guardará el código.