java - operadores - operador bit a bit
operadores de bits en c (10)
0 aquí no es un poco. Es un byte (al menos, o más) - 00000000. Utilizando bitwise o tendremos 11111111. Es -1 como entero con signo ...
Por qué operación a nivel de bit (~0);
imprime -1? En binario, no 0 debe ser 1. por qué ?
Como ~
no es inversión binaria, es inversión bit a bit. ¡La inversión binaria sería !
y puede (en Java) solo aplicarse a valores booleanos.
Creo que la verdadera razón es que ~ es el Complemento de Dos.
Javascript designa a la tilde de personaje, ~, para el complemento a dos, aunque en la mayoría de los lenguajes de programación tilde representa un cambio de bit para el complemento de uno.
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. Entonces para un tipo de byte firmado:
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
En realidad estás bastante cerca.
En binario, no 0 debe ser 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 unos.
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
Esta es la representación complementaria de dos de -1
.
Similar:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
Es decir, para un int
sin signo de 32 bits en la representación de complemento de dos, ~1 == -2
.
Otras lecturas:
- Complemento de dos
- Este es el sistema utilizado por Java (entre otros) para representar el valor numérico firmado en bits
- JLS 15.15.5 Operador de complemento a nivel de bit
~
- "tenga en cuenta que, en todos los casos,
~x
es igual a(-x)-1
"
- "tenga en cuenta que, en todos los casos,
Es inversión binaria, y en el segundo complemento -1 es inversión binaria de 0.
Lo que en realidad estás diciendo es ~ 0x00000000 y eso da como resultado 0xFFFFFFFF. Para un int (con signo) en java, eso significa -1.
Para entero de 32 bits con signo
~00000000000000000000000000000000=11111111111111111111111111111111
(que es -1)
Podría imaginar que el primer bit en un número firmado sea - (2 x -1 ) donde x es el número de bits.
Entonces, 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 todo 0:
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
Y cuando haces el bitwise no ~
cada uno de estos 0s se convierte en 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
Esto también es útil para entender el desbordamiento:
-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!
~
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-wise no ~
(justo debajo de ellos):
0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = -1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = -1271 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127