2010-08-11 23 views
10

Estoy tratando de tomar el complemento a uno de 0 a conseguir 1, pero me sale 4294967295. Aquí es lo que he hecho:salida extraña por bit a bit NO

unsigned int x = 0; 
unsigned int y= ~x; 
cout << y; 

Mi salida es 4294967295, pero espero 1, ¿por qué es esto asi? Por cierto, estoy haciendo esto en C++.

+0

1s complemento depende de la cantidad de bits en la cosa que encuentre el complemento. La característica que define el complemento de uno es que tiene dos números que son ambos cero. La operación de negación en el complemento 1 es equivalente al operador bit a bit como lo ha observado. Creo que tienes una idea equivocada sobre cómo funciona el complemento 1. – Omnifarious

Respuesta

21

¿Por qué esperas 1? Complemento de bits voltea todos los bits.

00000000000000000000000000000000 = 0 
       | 
      bitwise NOT 
       | 
       v 
11111111111111111111111111111111 = 4294967295 

Quizás usted esté pensando en un logical NOT. En C++ esto se escribe como !x.

0

Un número entero es más que 1 bit (es 4 bytes o 32 bits). Al anotarlo, lo está volteando todo, por lo que en este caso 00000 ... se convierte en 11111 ...

0

~ voltea todos los bits en la entrada. Su entrada es unsigned int, que tiene 32 bits, todos ellos 0. Volteando cada uno de esos 0 bits le da 32 bits de 1 en su lugar, que es binario para ese gran número.

Si solo desea voltear el bit menos significativo, puede usar y = x^1, es decir, use XOR en su lugar.

2

¿De dónde obtuviste la expectativa de 1?

Su comprensión de las operaciones bit a bit muestra claramente que falta, sería prudente para trabajar a través de ellos primero antes de publicar aquí ...

usted no está confundiendo con un ! que es un NO lógico, ¿verdad?

un complemento bit a bit ~ o un bit a bit operación NOT voltea todos los bits de 1 a 0 y viceversa dependiendo de donde en la máscara de bits se fija, por lo que por ejemplo, un 1 es

 
00000000 00000000 00000000 00000001 

haciendo un bit a bit ~ NO en que voltea a

 
11111111 11111111 11111111 11111110 

que le da el valor máximo menos 1 del tipo de datos entero en un sistema de 32 bits.

Aquí hay un enlace digno de esto que le muestra cómo hacer bit-twiddling aquí.

4

Tienes que mirar esto en binario para entender exactamente lo que está sucediendo.

unsigned int x = 0, es 00000000 00000000 00000000 00000000 en la memoria.

La declaración ~x voltea todos los bits, es decir, los giros anteriores en:

11111111 11111111 11111111 11111111

que se convierte en 4294967295 en forma decimal.

XOR le permitirá voltear solo ciertos bits. Si solo desea voltear el bit menos significativo, use x^1 en su lugar.

0

Puede utilizar

unsigned int y= !x; 

para obtener y = 1;

Cuestiones relacionadas