¿Por qué operación a nivel de bit (~0);
prints -1? En binario, no 0 debe ser 1. por qué ?bitwise not operator
Respuesta
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:
- Two's complement
- Este es el sistema utilizado por Java (entre otros) para representar firmado valor numérico en bits
- JLS 15.15.5 Bitwise complement operator
~
- "Observamos que, en todos los casos, es igual a
~x
(-x)-1
"
- "Observamos que, en todos los casos, es igual a
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.
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
Es Inversión binario, y en segundo complemento -1 es la inversión binaria de 0.
Lo que en realidad está diciendo es ~ 0x00000000 y que resulta en 0xFFFFFFFF. Para un int (con signo) en java, eso significa -1.
~
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 = -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
+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 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 ...
Para 32 bits entero con signo
~00000000000000000000000000000000=11111111111111111111111111111111
(que es - 1)
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!
Ejemplos más claros, ¡gracias! –
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.
- 1. GCC Bitwise Attribute
- 2. Bitwise "&" on a long?
- 3. XSLT Bitwise Logic
- 4. LC3 Assembly Bitwise Right Shift
- 5. xQuery LIKE-operator?
- 6. F # operator "?"
- 7. ruby operator "= ~"
- 8. jQuery @ operator?
- 9. Scala @ operator
- 10. Bitwise O: C# contra C++
- 11. Reversión de bits usando bitwise
- 12. Declaración condicional usando operadores Bitwise
- 13. Arduino y Bitwise, resultado inesperado
- 14. JavaScript - Bitwise XOR en cadenas?
- 15. operator std :: string() const?
- 16. C++ Operator() paréntesis sobrecarga
- 17. Groovy spread-dot operator
- 18. Scala operator oddity
- 19. Python y HTML '% Operator'
- 20. LINQ Between Operator
- 21. C++ lambda operator ==
- 22. Cómo definir/@ - like operator
- 23. PHP Ternary operator clarification
- 24. C++ typeid operator
- 25. Octave/Matlab: vectorising '==' operator?
- 26. \ operator en VB
- 27. typeof operator en C
- 28. ¿Por qué es necesario llamar explícitamente a Myclass :: operator string() con std :: string :: operator +()?
- 29. ¿Cómo implementar Bitcount usando solo operadores Bitwise?
- 30. C# bitwise shift en ushort (UInt16)
Si desea invertir un solo bit, usar 'x^1'. – kennytm
No es un operador 'no'. Es un operador de 'complemento'. – EJP
@EJP: A *** one *** complement operator. – kennytm