2012-08-23 34 views
6

Estoy tratando REALMENTE de voltear los bits en una variable C int. Lo estoy haciendo de este modo:C La negación a nivel de bit crea salida negativa:

input = 15; 

input = ~input; 

printf("%d", input); 

pero siempre se muestra como -16. Debe ser 0! si 15 está escrito como 1111, ¿por qué está retornando 10000?! Esto es enloquecedor! ¿Puede alguien POR FAVOR ayudarme?

+0

Olvidó las comillas en el formato '% d'; Los he agregado. –

+0

gracias .... Estaba un poco histérica y olvidé agregar que .... – Mizmor

+1

En general, es mejor copiar y pegar el código de trabajo real; que cuidadosamente evita errores tipográficos y similares. –

Respuesta

10

Desde int en que es más probable es que su sistema de un número de 32 bits, todos los bits se voltean, incluyendo las que eran ceros no significativos en el número original:

00000000000000000000000000001111 

se convierte en

11111111111111111111111111110000 

Este es un número negativo: el bit más significativo de 15 es cero, por lo que se convierte en 1 cuando se voltea.

Si desea mantener sólo los bits del número original, es necesario enmascarar con todos los que están en las posiciones significativos del número, de esta manera:

printf("%d\n", input & 0xF); 

AND ing con 0xF "le corta "todos los bits excepto los últimos cuatro".

+0

Bien, eso explica muy bien mi error! Ahora solo necesito encontrar una manera de ver solo los bits que se ven afectados. Mi tarea es encontrar cualquier 0 en la representación de un entero sin los bits iniciales .... – Mizmor

2

15 es del tipo int. Dependiendo de cuán grande sea int, la representación de 15 termina en 1111, pero comienza en con un grupo de 0 s.

El operador ~ voltea todos los bits; el 1 s (4 de ellos) se convierten en 0 s, y el 0 s (N-4 de ellos) se convierten en 1 s.

4

Esto ocurre porque input se compone de más de cuatro bits. Si asumimos que es un inputsigned char, con 8 bits (o un byte), entonces:

input == 15 == 0x0F == 0b00001111 

Como se puede ver, los 4 bits más significativos de input son todos 0. Después de un bit a bit operación NOT (~), tenemos:

~input == -16 == 0xF0 == 0b11110000 

los cuatro bits que solían ser cero ahora son queridos, y los ceros son ahora. El bit más significativo en una variable con signo determina su signo (0 es positivo y 1 es negativo). Por lo tanto, al voltear los bits, el signo se ha invertido. El número negativo se puede leer como:

1  1  1  1  0  0  0 0 
-128 + 64 + 32 + 16 + 0 + 0 + 0 + 0 

que resuelve al -16 que fue impreso.

Si su tarea es poner a cero una variable utilizando el NOT bit a bit, intente declarar input como unsigned char para evitar tener que preocuparse por el bit de signo. A continuación, establezca input en 255, el valor más alto que puede contener una variable de 8 bits (0xFF o 0b11111111).