2010-03-25 17 views
34

¿Por qué operación a nivel de bit (~0); prints -1? En binario, no 0 debe ser 1. por qué ?bitwise not operator

+7

Si desea invertir un solo bit, usar 'x^1'. – kennytm

+1

No es un operador 'no'. Es un operador de 'complemento'. – EJP

+1

@EJP: A *** one *** complement operator. – kennytm

Respuesta

64

De hecho, estás bastante cerca.

En binario, no debería ser 0 1

Sí, esto es absolutamente correcto cuando estamos hablando de un bit.

Sin embargo, un int cuyo valor es 0 es en realidad 32 bits de todos los ceros! ~ invierte los 32 ceros en 32 unidades.

System.out.println(Integer.toBinaryString(~0)); 
// prints "11111111111111111111111111111111" 

Esta es la representación de complemento a dos de -1.

mismo modo:

System.out.println(Integer.toBinaryString(~1)); 
// prints "11111111111111111111111111111110" 

Es decir, para una de 32 bits sin signo int en representación de complemento a dos, ~1 == -2.


Más información:

3

Porque ~ no es inversión binaria, es inversión bit a bit. La inversión binaria sería ! y solo (en Java) se puede aplicar a valores booleanos.

1

En la codificación binaria estándar, 0 es todo 0s, ~ es NO a nivel de bit. Todos los 1 es (con mayor frecuencia) -1 para los tipos de entero con signo. Así que para un tipo byte con signo:

0xFF = -1 // 1111 1111 
0xFE = -2 // 1111 1110 
... 
0xF0 = -128 // 1000 0000 
0x7F = 127 // 0111 1111 
0x7E = 126 // 0111 1110 
... 
0x01 = 1  // 0000 0001 
0x00 = 0  // 0000 0000 
0

Es Inversión binario, y en segundo complemento -1 es la inversión binaria de 0.

13

Lo que en realidad está diciendo es ~ 0x00000000 y que resulta en 0xFFFFFFFF. Para un int (con signo) en java, eso significa -1.

7

~ es un operador bit a bit.

~0 = 1 which is -1 in 2's complement form 

http://en.wikipedia.org/wiki/Two's_complement

Algunos números en forma de complemento a dos y su bit a bit no ~ (justo debajo de ellos):

0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = -128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = -127

1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127

+0

+1 para el claro ejemplo. Los programadores a los que les gusta resolver rompecabezas pueden descubrir cómo funciona y cómo funciona el complemento a dos simplemente estudiando cuidadosamente su ejemplo. –

0

0 aquí no es un poco. Es un byte (por lo menos, o más) - 00000000. El uso de bit a bit o tendremos que 11111111. Es -1 como entero de ...

0

Para 32 bits entero con signo

~00000000000000000000000000000000=11111111111111111111111111111111 (que es - 1)

9

Puede imaginar que el primer bit en un número con signo sea - (2 x -1) donde x es el número de bits.

Así, dado un número de 8 bits, el valor de cada bit (en orden de izquierda a derecha) es:

-128 64 32 16 8 4 2 1 

Ahora, en binario, 0 es, obviamente, todos 0:

-128 64 32 16 8 4 2 1 
0  0 0 0 0 0 0 0 0 = 0 

Y cuando lo hace el nivel de bits no ~ cada uno de estos 0s se convierte en una relación 1:

 -128 64 32 16 8 4 2 1 
~0  1 1 1 1 1 1 1 1 
= -128+64+32+16+8+4+2+1 == -1 

Este es también útil n desbordamiento de comprensión:

 -128 64 32 16 8 4 2 1 
126  0 1 1 1 1 1 1 0 = 126 
+1  0 1 1 1 1 1 1 1 = 127 
+1  1 0 0 0 0 0 0 0 = -128 overflow! 
+0

Ejemplos más claros, ¡gracias! –

0

creo que la verdadera razón es que ~ es complemento a dos.

Javascript designa la tilde carácter, ~, para el complemento a dos, a pesar de que en la mayoría de los lenguajes de programación tilde representa un conmutador de bits para el complemento a uno.