operator operadores example bitwise java javascript c++ c twos-complement

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:


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 = -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