Diferencia entre >>> y >>

Resuelto Vipul asked hace 14 años • 0 respuestas

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

Vipul avatar May 11 '10 21:05 Vipul
Aceptado

>>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 11111111o -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.

danben avatar May 11 '2010 14:05 danben

>>>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>>sson posiciones de bits ndesplazadas a la derecha scon extensión de signo .

El valor de n>>>sson posiciones de bits ndesplazadas a la derecha scon 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
polygenelubricants avatar May 11 '2010 14:05 polygenelubricants

>>>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.

corsiKa avatar May 11 '2010 14:05 corsiKa

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.

Matt avatar May 11 '2010 14:05 Matt