Diferença entre >>> e >>

Qual é a diferença entre os operadores >>> e >> em Java?

>> é a mudança aritmética para a direita, >>> é o deslocamento lógico para a direita.

Em um deslocamento aritmético, o bit de sinal é estendido para preservar a assinatura do número.

Por exemplo: -2 representado em 8 bits seria 11111110 (porque o bit mais significativo tem peso negativo). Deslocando-o um bit usando a mudança aritmética, você terá 11111111 , ou -1. O deslocamento lógico à direita, no entanto, não importa que o valor possa representar um número assinado; simplesmente move tudo para a direita e preenche a partir da esquerda com 0s. Mudando o nosso bit direito de um-bit usando o deslocamento lógico, daríamos 01111111 .

>>> é unsigned-shift; ele irá inserir 0. >> é assinado e irá estender o bit de sinal.

Operadores de deslocamento JLS 15.19

Os operadores de turno incluem shift à esquerda < < , shift à direita assinado >> e shift à direita não assinado >>> .

O valor de n>>s é n deslocado para a direita nas posições de bit com extensão de sinal .

O valor de n>>>s é n deslocado para a direita nas posições de bit com extensão zero .

  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 tornar as coisas mais claras adicionando contrapartida 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" 

Como é positivo, tanto os turnos assinados quanto os não assinados adicionarão 0 ao bit mais à esquerda.

Perguntas relacionadas

  • Shift Direito para Executar Divide por 2 On -1
  • Está mudando bits mais rápido do que multiplicando e dividindo em Java? .LÍQUIDO?
  • o que é c / c + maneira equivalente de fazer '>>>' como em java (shift direito não assinado)
  • Deslocamento lógico negativo
  • Operador do Java >> versus >>>
  • Qual é a diferença entre os operadores Java >> e >>>?
  • Diferença entre os operadores >>> e >>
  • Qual é a razão pela qual linguagens de alto nível como C # / Java mascaram o operando de contagem de mudança de bits?
    • 1 >>> 32 == 1

Ambos estão à direita, mas >>> unsigned está unsigned

Da documentação :

O operador de deslocamento direito não sinalizado “>>>” muda um zero para a posição mais à esquerda, enquanto a posição mais à esquerda depois de “>>” depende da extensão do sinal.

>>> sempre colocará um 0 no bit mais à esquerda, enquanto >> colocará um 1 ou um 0 dependendo de qual é o sinal dele.

O deslocamento direito lógico ( v >>> n ) retorna um valor no qual os bits em v foram deslocados para a direita por n posições de bit, e os 0s são deslocados do lado esquerdo. Considere a mudança de valores de 8 bits, escritos em binário:

 01111111 >>> 2 = 00011111 10000000 >>> 2 = 00100000 

Se interpretarmos os bits como um inteiro não negativo não assinado, o deslocamento lógico direito terá o efeito de dividir o número pela potência correspondente de 2. No entanto, se o número estiver na representação de complemento de dois, o deslocamento lógico direito não divide corretamente os números negativos . Por exemplo, o segundo deslocamento à direita acima muda de 128 para 32 quando os bits são interpretados como números não assinados. Mas muda de -128 para 32 quando, como é típico em Java, os bits são interpretados em complemento de dois.

Portanto, se você está mudando a fim de dividir por uma potência de dois, você quer o deslocamento à direita aritmético ( v >> n ). Ele retorna um valor no qual os bits em v foram deslocados para a direita por posições de n bits e cópias do bit mais à esquerda de v são deslocadas do lado esquerdo:

 01111111 >> 2 = 00011111 10000000 >> 2 = 11100000 

Quando os bits são um número na representação do complemento de dois, o deslocamento à direita aritmético tem o efeito de dividir por uma potência de dois. Isso funciona porque o bit mais à esquerda é o bit de sinal. Dividindo por um poder de dois deve manter o sinal o mesmo.

Leia mais sobre os Operadores Bitwise e Bit Shift

 >> Signed right shift >>> Unsigned right shift 

O padrão de bits é dado pelo operando esquerdo e o número de posições a serem alternadas pelo operando direito. O operador de deslocamento à direita sem sinal >>> muda um zero para a posição mais à esquerda ,

enquanto a posição mais à esquerda após >> depende da extensão do sinal.

Em palavras simples, >>> sempre muda um zero para a posição mais à esquerda, enquanto que >> desloca com base no sinal do número, ou seja, 1 para número negativo e 0 para número positivo.


Por exemplo, tente com números negativos e positivos.

 int c = -153; System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c < <= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2)); System.out.println(Integer.toBinaryString(c < <= 2)); System.out.println(); c = 153; System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c < <= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c < <= 2)); 

saída:

 11111111111111111111111111011001 11111111111111111111111101100100 111111111111111111111111011001 11111111111111111111111101100100 100110 10011000 100110 10011000 

O operador lógico de deslocamento à direita ( >>> N ) desloca os bits para a direita por N posições, descartando o bit de sinal e preenchendo os N bits mais à esquerda com 0s. Por exemplo:

 -1 (in 32-bit): 11111111111111111111111111111111 

depois que uma operação >>> 1 se torna:

 2147483647: 01111111111111111111111111111111 

O operador aritmético de deslocamento à direita ( >> N ) também desloca bits para a direita por N posições, mas preserva o bit de sinal e preenche os N bits mais à esquerda com 1s. Por exemplo:

 -2 (in 32-bit): 11111111111111111111111111111110 

depois que uma operação >> 1 se torna:

 -1: 11111111111111111111111111111111