Pergunta do java ranch

(#50) What happens when you bit shift by a number greater than or equal to the number of bits in the result?
(eg. int c = 270; c >> 33)

answer: you get 270 >> 1
Shifting bits by a number greater than or equal to the number of bits in the result (eg. 32 bits for an int) will cause the value to be shifted by the number modulo the number of bits in the value (you shift by 33%32 which is 1)

Blz, um int tem 32 bits e um long tem 64 bits. mas por que a resposta é esse 270 >> 1 ?
Tem algum código que pode demonstrar isso?

Obrigado.

Cara não se preocupe com operações de bit pois elas não caem mais na prova desde a versão 1.4

Realmente…A SCJP 5 ou 6 não cai mais isso…

[quote=lipe82]Blz, um int tem 32 bits e um long tem 64 bits. mas por que a resposta é esse 270 >> 1 ?
Tem algum código que pode demonstrar isso?[/quote]

O 270, é porque a variável foi inicializada com 270.

O que ele disse é o seguinte. Se você tem uma variável de 32 bits, e faz um shift de mais de 32 bits, ele irá “remover” valores de 32 em 32 até chegar num número que caiba em 32 bits, e então fazer o shift por esse número.

No caso de um shift por 33:

33 - 32 = 1

Equivaleria a fazer um shift de 1 bit. Se fosse 90

90 - 32 = 58
58 - 32 = 26

Equivaleria a fazer um shift de 26 bits.

A operação que ele sugere (equivalente a essa) é mais simples.
Você pode obter o mesmo resultado através do resto de 90 por 32 (módulo). Esse resto é o número 26. (90 / 32 = 2, resto 26)

Rapaz a resposta para a sua dúvida está escrita ai! Mas está em inglês!

O funcionamento do >> e << é complicado, não sei explicar agora, mas a resposta é 270 >> 1 pelos motivos:

270 é um inteiro;
um inteiro tem 32 bits;
o valor passado depois do >> é maior do que 32;
quando isso acontece o compilador faz (Valor Maior) % (Valor em Bits do Tipo primitivo),
ou seja 33%32.

Como o operator % retorna o resto da divisão, e o resto da divisão de 33 por 32 é 1 o resultado é 270 >> 1 :wink: