Кто бы ни думал, что байты должны быть подписаны, когда Java был изобретен, должен быть вынут и избит влажной палочкой сельдерея, пока они не кричат: -)
Вы можете делать то, что хотите, приводя к int и гарантируя, что вы никогда не сдвинете 1 в верхний бит, что-то вроде этого:
byte x = -1;
int x2 = ((int)x) & 0xff;
for(int i = 0; i < 8; i++)
{
x2 = (x2 >>> 1);
System.out.println("X: " + x2);
}
Ваша конкретная проблема заключается в том, что >>> выполняет приведение к int для сдвига, а затем возвращает его обратно в байт, как показано здесь:
byte x = -1;
int x2 = ((int)x) & 0xff;
int x3;
int x4 = x2;
for(int i = 0; i < 8; i++)
{
x2 = (x2 >>> 1);
System.out.println("X2: " + x2);
x3 = (x >>> 1);
x = (byte)x3;
x4 = (x4 >>> 1);
System.out.println("X: " + x3 + " " + x + " " + x4);
}
Какие выходы:
X2: 127
X: 2147483647 -1 127
X2: 63
X: 2147483647 -1 63
X2: 31
X: 2147483647 -1 31
X2: 15
X: 2147483647 -1 15
X2: 7
X: 2147483647 -1 7
X2: 3
X: 2147483647 -1 3
X2: 1
X: 2147483647 -1 1
X2: 0
X: 2147483647 -1 0
Вы можете ясно видеть, что x и x3 не работают (даже если x3 сдвигается правильно, приведение его к байту в x снова устанавливает его в -1). х4 работает отлично.