Shift de bits

Porque o valor de sh1 está igual a sh2?
O perador >>> não é “unsigned”?

Abaixo segue o código:

[code]
public class Teste {

public static void main(String[] args) {
	byte valor = (byte) 0xFF;
	byte sh1 = (byte) (valor >>> 1);
	byte sh2 = (byte) (valor >> 1);
	
	showBinary(sh1);
	showBinary(sh2);
}

public static void showBinary(byte value) {
	StringBuffer sb = new StringBuffer();
	for (int i = 7; i >= 0; i--) {
		sb.append((value >> i) & 0x01);
	}
	System.out.println(sb.toString());
}

}[/code]

Aqui tem uma pegadinha … Vá reclamar com o James Gosling.
Vá reclamar (mesmo!) com ele, já que não existe código equivalente no C++ para “>>>” (se você usar “unsigned char” o “>>” costuma funcionar do jeito que você quer, mas depende da implementação, já que isso não está formalmente definido).

1) 		byte valor = (byte) 0xFF;
2) 		byte sh1 = (byte) (valor >>> 1);
3) 		byte sh2 = (byte) (valor >> 1);

Na linha 2 o que você na verdade está fazendo é:

byte sh1 = (byte) ((int) valor >>> 1);

já que os operadores trabalham no mínimo com “int”.
Acho que você deve ter entendido (um byte 0xFF, convertido para int, vai dar o valor 0xFFFFFFFF, que shiftado para a direita vai dar 0x7FFFFFFF. Quando for convertido para byte vai dar 0xFF mesmo).
Para resolver seu problema, você pode fazer:

byte sh1 = (byte) ((valor & 0xFF) >>> 1);

Teste e veja o que ocorreu.

Valeu Thingol

Essa é pegadinha de prova eheheh

Isso cai em prova? Se for, é pegadinha, e das boas.

Normalmente uso “programação defensiva” (é parecido com “direção defensiva”, aqueles cursos onde você aprende a fazer manobras radicais com o carro para poder fugir de seqüestradores e bandidos).
O que eu chamo de “programação defensiva”? Onde há lugares onde pode haver dúvidas na leitura do programa, evitar os problemas em primeiro lugar.

Por exemplo, quando trabalhar com bytes, usar ("& 0xFF") em vários lugares, tais como o que citei nesse exemplo.