Diferencia entre >>> y >>
¿ Cuál es la diferencia entre >>>
los >>
operadores y en Java?
>>
es un desplazamiento aritmético a la derecha, >>>
es un desplazamiento lógico a la derecha.
En un desplazamiento aritmético, el bit de signo se extiende para preservar el signo del número.
Por ejemplo: sería -2 representado en 8 bits 11111110
(porque el bit más significativo tiene peso negativo). Cambiarlo un bit a la derecha usando desplazamiento aritmético le daría 11111111
o -1. Sin embargo, al desplazamiento lógico a la derecha no le importa que el valor pueda representar un número con signo; simplemente mueve todo hacia la derecha y lo completa desde la izquierda con 0. Desplazar nuestro -2 un bit hacia la derecha usando un desplazamiento lógico daría 01111111
.
>>>
es un turno sin signo; insertará 0. >>
está firmado y extenderá el bit de signo.
JLS 15.19 Operadores de turno
Los operadores de turno incluyen desplazamiento a la izquierda
<<
, desplazamiento a la derecha con signo>>
y desplazamiento a la derecha sin signo>>>
.El valor de
n>>s
son posiciones de bitsn
desplazadas a la derechas
con extensión de signo .El valor de
n>>>s
son posiciones de bitsn
desplazadas a la derechas
con extensión cero .
System.out.println(Integer.toBinaryString(-1));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >> 16));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >>> 16));
// prints "1111111111111111"
Para aclarar las cosas añadiendo una contraparte positiva
System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"
Dado que es positivo, tanto los cambios con signo como sin signo agregarán 0 al bit más a la izquierda.
Preguntas relacionadas
- Desplazamiento a la derecha para realizar la división entre 2 en -1
- ¿Cambiar bits es más rápido que multiplicar y dividir en Java? .¿NETO?
- ¿Cuál es la forma equivalente en C/C++ de hacer '>>>' como en Java (desplazamiento a la derecha sin firmar)?
- Cambio lógico negativo
- ¿Java >> versus >>> Operador?
- ¿Cuál es la diferencia entre los operadores Java >> y >>>?
- Diferencia entre operadores >>> y >>
- ¿Cuál es la razón por la que los lenguajes de alto nivel como C#/Java enmascaran el operando de recuento de desplazamiento de bits?
1 >>> 32 == 1
>>>
siempre pondrá un 0 en el bit más a la izquierda, mientras que >>
pondrá un 1 o un 0 dependiendo de cuál sea el signo.
Ambos son de desplazamiento a la derecha, pero >>>
esunsigned
De la documentación :
El operador de desplazamiento a la derecha sin signo ">>>" desplaza un cero a la posición más a la izquierda, mientras que la posición más a la izquierda después de ">>" depende de la extensión del signo.