La negación C a nivel de bits crea una salida negativa:

Estoy intentando REALMENTE hacer girar los bits en una variable C int. Lo estoy haciendo así:

input = 15; input = ~input; printf("%d", input); 

PERO SIEMPRE SE MUESTRA como -16 . ¡Debería ser 0 ! si 15 se escribe como 1111 , ¿por qué devuelve 10000 ? ¡Esto es enloquecedor! ¿Puede alguien POR FAVOR ayudarme?

Dado que lo más probable es que int en su sistema sea un número de 32 bits, todos los bits se invierten, incluidos los que eran ceros insignificantes 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 invierte.

Si desea mantener solo los bits del número original, necesita enmascarar con todos los que se encuentran en las posiciones significativas del número, como esto:

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

AND con 0xF “cortan” todos los bits excepto los últimos cuatro.

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

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

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

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

Los cuatro bits que solían ser cero son ahora unos, y los que ahora son ceros. El bit más significativo en una variable con signo determina su signo (0 es positivo y 1 es negativo). Así, 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 

Lo que resuelve el -16 que se imprimió.

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

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

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