2009-12-29 18 views
5

Si el número cambiado es positivo >>> y >> funcionan igual.Diferencia entre los operadores >>> y >>

Si el número es negativo desplazado >>> llena los bits más significativos con 1s, mientras que los cambios >> operación de llenado de los MSB con 0.

Es mi entendimiento correcto?

Si los números negativos se almacenan con la MSB configurada en 1 y no en la forma complementaria de 2s que utiliza Java, los operadores se comportarían de manera completamente diferente, ¿correcto?

+0

Posibles duplicados: [Diferencia entre >>> y >>] (http://stackoverflow.com/q/2811319/1529630), [Operador de Java >> contra >>>] (http://stackoverflow.com/q/1034640/1529630) – Oriol

Respuesta

8

La manera en que se representan los números negativos se denomina complemento de 2. Para demostrar cómo funciona esto, tome -12 como ejemplo. 12, en binario, es 00001100 (supongamos que los enteros son 8 bits, aunque en realidad son mucho más grandes). Tome el complemento de 2 simplemente invirtiendo cada bit, y obtendrá 11110011. Luego, simplemente agregue 1 para obtener 11110100. Tenga en cuenta que si aplica los mismos pasos nuevamente, obtiene 12 positivos de nuevo.

>>> cambia en cero sin importar qué, así que 12 >>> 1 debería darle 00000110, que es 6, y (-12) >>> 1 debería darle 01111010, que es 122. Si De hecho, intente esto en Java, obtendrá un número mucho mayor ya que los datos de Java son mucho más grandes que 8 bits.

El >> cambia en un bit idéntico al bit más alto, de modo que los números positivos se mantengan positivos y los negativos permanezcan negativos. 12 >> 1 es 00000110 (aún 6) y (-12) >> 1 sería 11111010 que es negativo 6.

1

Todo lo contrario, la >>> llena de ceros, mientras que >> se llena de los ho si el bit es 1.

+0

¿Puede explicar por qué '7 >>> 32 = 7'. Oí hablar de cambios circulares, pero pensé que solo se aplicaba a '>>'. ¿No sería '7 >>> 32' después de 32 turnos igual a cero? –

+0

@IanLimarta: si el lado izquierdo es un int, la cantidad del cambio se reduce al mod 32. En su caso, eso significa que la cantidad del cambio es 0, que es efectivamente un no-op. Ver [el JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19) –

2

Definition of the >>> operator in the Java Language Specification:

El valor de n es n>>>s s-derecha desplazado posiciones de bits con extensión cero. Si n es positivo, el resultado es el mismo que el de n>>s; si n es negativo, el resultado es igual al de la expresión (n>>s)+(2<<~s) si el tipo del operando de la izquierda es int, y al resultado de la expresión (n>>s)+(2L<<~s) si el tipo del operando de la izquierda es long.

Cuestiones relacionadas