2010-02-11 31 views
16

Estoy practicando para el examen SCJP usando notas de cram de Internet.Operadores de desplazamiento bit a bit. Firmado y sin firmar

De acuerdo con mis notas, se supone que el operador >> tiene el signo de cambio a la derecha, con el bit de signo introducido desde la izquierda. Mientras que el operador de desplazamiento a la izquierda << se supone que preserva el bit de signo.

Jugando sin embargo, yo soy capaz de cambiar el signo con el operador << (Fe Integer.MAX_VALUE << 1 se evalúa como -2, mientras que nunca soy capaz de cambiar el signo con el operador >>.

que debe ser malentendido ? algo aquí, pero lo que

+0

Vea lo que '-2 << 31' le da. –

+0

Sí, veo lo que quieres decir! –

Respuesta

39

">>" se firma, ya que mantiene el signo utiliza el dígito más a la izquierda en la representación binaria de un número como material de relleno, por ejemplo:..

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

    01010010 
>> 00101001 

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

11011011 
>>> 01101101 

    01010010 
>>> 00101001 

En representación binaria, el dígito más a la izquierda determina el signo del número. Entonces, si es '1' entonces 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.

+0

Ah, vale, entonces entiendo cómo se supone que deben trabajar los operadores de cambio a la derecha. ¡Gracias! ¿Pero por qué puedo cambiar el signo con "<<"? –

+0

Porque cambia en otra dirección y el dígito más a la izquierda depende del número original. Utiliza 0 como relleno pero lo agrega al lado derecho de su número. – Roman

+0

El signo de un entero está determinado por el valor de su bit más a la izquierda. Si cambia en '0' cuando es '1 'o viceversa, el signo del resultado cambia. –

2

La idea detrás de los cambios es que pueden actuar como multiplicando y dividiendo por potencias de 2 (< < 1 es equivalente a * = 2, >> 2 es equivalente a/= 4), por lo que la versión firmada de cambio existe. Sin embargo, el cambio sin signo no conserva los negativos, necesariamente. El operador < < en realidad no conserva el signo, como sugiere; simplemente sucede en tu ejemplo. Intenta hacer un cambio 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 de horario "firmado" es porque, si el número cambia de positivo a negativo (o viceversa), de todos modos saliste de los límites del tipo de variable.

Cuestiones relacionadas