Certificação - Duvida <<, >> e >>>

Ae galera
Estou me preparando para fazer o exame de certificação em JAVA (Programador) daí eu me deparei com um assunto um pouco confuso . São os tais operadores de shift <<, >> , >>>
Alguem tem um bom material sobre eles? Queria ver também o seu uso prático…
Acho que seria de grande valia um artigo/tutorial sobre o assunto aqui no site do GUJ…
Abraços!

Fala,

Bom, eu posso te dizer o básico.

O shift >> na prática, devide o número por 2 elevado ao segundo param.

por exemplo:

4 >> 1 = 2
4 >> 2 = 1

O q acontece com os bits ???

4 = 0100

shift 1

0100 >> 0010

shift de novo

0010 >> 0001

Note que o sinal se mantem, se fosse um valor negativo, esse se manteria.

Note tb que o valor minimo para negativos é -1 e não 0. -4 >> 5 = -1 mas 4 >> 5 = 0;

O shift << multiplica por dois.

2 << 1 = 4
2 << 2 = 8

Mesma coisa… coloque zeros do lado esquerdo.

Nota: se vc fizer por exemplo 10 >> 33, o compilador era otimizar para:

10 >> 33 % 32 => 10 >> 1. PQ??? Isso é uma otimização antiga que fizeram em processadores e q não vem ao caso descutir aqui.

Então, lembre-se int tem 32 bits, por issofaz-se mod 32, se for byte, faça mod 8…etc…

Agora o especial >>> este faz a mesma coisa q o >> mas ao invés de manter o sinal, ele inclui zeros a esquerda.

… bom é isso. Sou meio ruim em explicar mas acho que da pra dar uma praticada com o seu próprio código. Tente usar valores como Integer.MAX_VALUE… teste até entender.

[]'s

Marco.

OOPs…

Para o << deve-se colocar zeros a direita… foi mal.

[]'s

Só uma coisa.
Os operadores <<, >> e >>> só trabalham com ints ou longs. Se vc for usar com byte, ele será convertido para um int e o %32 (ou %64) continua sendo aplicado.

byte i = 2;
byte l = 20;
byte resp = i &gt;&gt; l; //erro de compilação
//corrigindo
byte resp = &#40;byte&#41; &#40;i &gt;&gt; l&#41;

Olá duardor

Complementando as explicações dos colegas:

Os operadores de shifting são utilizados em algumas técnicas mais avançadas, incluindo mascaramento de bits por exemplo.

Para você REALMENTE entender o porque da existência destes operadores, você precisa entender o que acontece, antes de mais nada, você precisa conhecer um pouco sobre números binários. (Estou falando de matemática mesmo).

Cada número é representado por um padrão de bits, vamos pegar um byte para facilitar, por exemplo o número 5 é representado desta forma.

00000101

Como em java, todos os tipos primitivos possuem extensão de sinal (podem ser positivos ou negativos) os bits mais significativos indicam que o valor é positivo (0 neste caso).

Os operadores >> e << movem os bits para a direita e para a esquerda (respectivamente) respeitando o sinal do valor (positivo, que é 0 ou negativo, que é 1) . O operador >>> sempre move os bits para a direita e SEMPRE coloca zeros à esquerda.

Exemplo:

5 >> 1 (move uma posição para a direita)
Resultado: 00000010

Note que o ‘1’ é perdido…

O assunto é um pouco vasto… mas, espero ter contribuído…qualquer dúvida, estamos ai :wink:

Agradeço aos colegas , era mais ou menos o q eu imaginava mesmo… Eu conheço binarios sim hehehehe To no sexto periodo do curso de ciencia da computacao , se nao conhecesse me matava hehehehe
Alguem conhece alguma questao real do exame de certificacao que cobre esses operadores?
dá pra postar aqui?
Bom valeu galera!!!

Ola

Para mim apareceu uma só . Colocaram uma lista de operações e pediram para eu marcar quais duas eram equivalentes…

Não lembro todas mas tinha:

3 << 2

e

3 * 4

Fácil.

[]'s

Oi duardor :slight_smile:

Foi mal… hehehe mas sabe como é… escrevi pensando nos demais usuários lendo :wink:

posso afirmar que aplicando o operador >>> sobre um número negativo vai resultar sempre em um número positivo muito grande?

Não necessariamente muito grande.
Um int tem 32 bits, e em um int negativo o bit mais da esquerda é 1.
Quando você começa a “empurrar” esse 1 para os bits significativos, se empurrar só um pouco vai dar um número muito grande. Porém, quanto mais você “empurrar” ele (até um limite de 32), menor vai ficando o resultado.
Ex.: -10 >>> 30 = 3

ok, obrigado