operador java bit-shift scjp

java - Operadores de cambio a nivel de bit. Firmado y sin firmar



<< en java (2)

Estoy practicando para el examen SCJP usando notas de Cram de Internet.

Según mis notas, se supone que el operador >> está firmado a la derecha, con el bit de signo traído desde la izquierda. Mientras que el operador de desplazamiento a la izquierda << se supone que conserva el bit de signo.

Sin embargo, al jugar, puedo cambiar el signo con el operador << (fe Integer.MAX_VALUE << 1 evalúa como -2 , mientras que nunca puedo cambiar el signo con el operador >> .

Debo estar malinterpretando algo aquí, pero ¿qué?


">>" está firmado porque mantiene la señal. Utiliza el dígito más a la izquierda en la representación binaria de un número como relleno. Por ejemplo:

| this value is used as a filler 11011011 >> 11101101 01010010 >> 00101001

">>>" es una versión sin firmar de este operador. Siempre usa cero como relleno:

11011011 >>> 01101101 01010010 >>> 00101001

En la representación binaria, el dígito más a la izquierda determina el signo del número. Entonces, si es ''1'' tenemos un valor negativo y si es ''0'', entonces nuestro número es positivo. Es por eso que usar el dígito más a la izquierda como relleno permite mantener el signo permanente.


La idea detrás de los cambios es que pueden actuar como multiplicar y dividir por potencias de 2 (<< 1 es equivalente a * = 2, >> 2 es equivalente a / = 4), por lo que existe la versión firmada de cambio. Sin embargo, el cambio no firmado no conserva los negativos, necesariamente. El operador << en realidad no conserva el signo, como usted sugiere; Simplemente sucede en tu ejemplo. Trate de hacer un giro a la izquierda en 2,147,483,647; no se mantiene positivo La razón por la que no se molestan en intentar hacer un cambio a la izquierda "firmado" es porque, si el número cambia de positivo a negativo (o viceversa), de todos modos, se salió de los límites del tipo de variable.