operator operador logical bitwise arithmetic java operators bit-manipulation

operador - logical operator java



¿El operador>> versus>>> de Java? (9)

Desde Java Notes: Operadores de Bitwise :

n >> p (desplazamiento a la derecha) Desplaza los bits de n posiciones p derechas. Si n es un número firmado de complemento a 2, el bit de signo se desplaza a las posiciones de orden superior.

Ejemplo: 5 >> 2 = 1

n >>> p (desplazamiento hacia la derecha) Desplaza los bits de n posiciones p derechas. Los ceros se desplazan a las posiciones de orden superior.

Ejemplo: -4 >>> 28 = 15

Esta pregunta ya tiene una respuesta aquí:

No tengo mi libro de referencia de Java y me cuesta mucho encontrar una respuesta con Google.

¿Cuál es la diferencia entre los operadores ">>" y ">>>" en Java?

int value = 0x0100; int result = (value >> 8); System.out.println("(value >> 8) = " + result); // Prints: "(value >> 8) = 1" result = (value >>> 8); System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1"


El >> es un cambio aritmético, que conserva el bit de signo en cualquier bit ''vacío''. El otro es un cambio lógico que llena los puntos vacantes con ceros.


El cambio aritmético >> es la división por dos para los enteros con signo, mientras que el cambio lógico >>> es la división por dos para los números sin signo (si interpreta el patrón de bits en un int Java firmado como un entero sin signo).


La respuesta correcta se ha publicado más de una vez, pero no de una fuente autorizada.

Esto es de los operadores de turno JLS §15.19 :

Los operadores de cambio incluyen el desplazamiento a la izquierda << , el desplazamiento a la derecha firmado, y el desplazamiento a la derecha sin signo >>> ; son sintácticamente asociativos a la izquierda (se agrupan de izquierda a derecha). El operando de la izquierda de un operador de cambio es el valor que se debe cambiar; El operando de la derecha especifica la distancia de desplazamiento.

...

El valor de n>>s es n posiciones de bit de desplazamiento hacia s derecha con extensión de signo. El valor resultante es ⌊ n / 2 s ⌋. Para los valores no negativos de n , esto es equivalente a truncar la división de enteros, calculada por el operador de división de enteros / , por dos a la potencia s .

El valor de n>>>s es n posiciones de bit de desplazamiento hacia s derecha con extensión cero. Si n es positivo, entonces 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 . El término agregado (2<<~s) o (2L<<~s) cancela el bit de signo propagado. (Tenga en cuenta que, debido al enmascaramiento implícito del operando de la derecha de un operador de cambio, ~s como una distancia de desplazamiento es equivalente a 31-s cuando se cambia un valor int y a 63-s cuando se cambia un valor long ).


Los enteros con signo utilizan el bit de orden superior para denotar signo.

Así que >> conserva el signo, mientras que >>> no lo hace. Es por esto que >> se conoce como el cambio aritmético y >>> es el cambio lógico .

De esta manera, puede hacer (asumiendo enteros de 32 bits) lo siguiente:

  • -10 >> 1 produce -5 ( 0xFFFFFFF6 >> 1 produce 0xFFFFFFFB - note que el bit de orden superior permanece igual.)
  • -10 >>> 1 produce 2147483643 ( 0xFFFFFFF6 >>> 1 produce 0x7FFFFFFB - note que todos los bits se desplazaron, por lo que el bit de orden superior ahora es cero. El número ya no es negativo según la aritmética de complemento de dos.)

Para enteros positivos, >> y >>> actúan de la misma manera, ya que el bit de orden superior ya es cero.

También explica por qué no hay necesidad de un operador <<< . Dado que el signo se destruiría deslizando los bits hacia la izquierda, no se asignaría a ninguna operación aritmética razonable.


Para números positivos, no hay diferencia. Los números negativos (complemento de dos) se rellenarán con ceros para >>> y unos para >>.

1010 0110 >>> 2 = 0010 1001

1010 0110 >> 2 = 1110 1001


Tiene que ver con valores matemáticos firmados. Las >>> pastillas en ceros para los bits de alto orden, las >> conservan el bit de signo y lo introducen.


alguna info

El operador >> conserva los bits más a la izquierda. Los bits más a la izquierda se rellenan con el contenido anterior. Esto tiene que ver con la extensión de signo. En este caso hay un 1 a la izquierda y se conserva. Si no desea mantener el 1 a la izquierda, use el operador >>> que desplaza 0 en los bits más a la izquierda