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.