Operadores menos comuns

Boa tarde meus amigos,

Tenho uma pequena dúvida em relação ao uso de alguns operadores menos comuns na linguagem Java. Alguém conhece a função dos operadores “>>”, “<<” e “>>>”?

Muito obrigado

Abraço a todos :slight_smile:

São operadores de bit shift

Se você tem um número binário 00010100 (20 em decimal),

00010100 >> 1 -> 00001010 (o mesmo resultado que uma divisão inteira por 2, 20/2 = 10)

00010100 << 1 -> 00101000 (multiplicação por 2, 20*2 = 40)

é um operador de shift de bits sem sinal

11000000 >>> 1 -> 01100000 (11000000 em complemento de dois é um valor negativo em decimal(em um numero de 8 bits))

enquanto

11000000 >> 1 -> 11100000 (mantém o sinal)

Espero não estar enganado.

É o contrário.
Dois operadores ‘>>’ deslocamento somente dos bits de representação numérica.
Três operadores ‘>>>’ desloca além dos bits de representação numérica, o bit de representação do sinal também.

Rafael, desculpe mas o Bruno é que está certo (>> = signed shift right, >>> = unsigned shift right).

O >>> não existe no C/C++ nem no C#, porque nessas linguagens existe o tipo "unsigned".

Ufa, pensei que li errado a documentação da Sun :smiley: Obrigado!

[quote=thingol]Rafael, desculpe mas o Bruno é que está certo (>> = signed shift right, >>> = unsigned shift right).
[/quote]

Então, foi o isso o que eu quis dizer.
Com dois operadore ‘>>’ você desloca somente os bits do sinal, por exemplo -8 >> 1 vai resultar em -4. Ou seja, eu desloquei somente os bits que representam o número. (De 1000 para 0100)
Já com três operadores ‘>>>’, eu desloco além dos bits que representam o número, o bit do sinal também: -8 >>> 1 vai resultar 2147483644

Não é isso? Ou eu que to viajando?

Rafael, a idéia é que com o ">>" você copia os bits do sinal (que pode ser 0 ou 1), e com o ">>>" você só acrescenta bits zero. Você só "trocou as bolas" ou "bolou as trocas" - qual é o jeito certo de se dizer?

Por exemplo, se você fizer

(-1) >> 2 --> [1]111.1111.1111.1111.1111.1111.1111.1111 >> 2 --> 11[1]1.1111.1111.1111.1111.1111.1111.1111 == -1
(-1) >>> 2 --> [1]111.1111.1111.1111.1111.1111.1111.1111 >>> 2 --> 00[1]1.1111.1111.1111.1111.1111.1111.1111 == 1.073.741.823

É só testar.