3

I have this code:

int i = 255;
byte b = (byte) i;
int c;
System.out.println(Integer.toBinaryString( i));
System.out.println("b = " + b); // b = -1
c=b>>>1;
System.out.println(Integer.toBinaryString( c));
System.out.println(c);

But I can't understand how it works. I think that unsigned shifting to 255(11111111) should give me 127(0111111) but it doesn't. Is my assumption wrong?

4

3 回答 3

2

移位运算符,包括>>>ints 进行操作。的值b-1因为是有符号的,所以在班次之前byte提升。int这就是为什么你会看到你看到的结果。

255重新解释为-1255 将其所有 8 位设置为 1的原因。当您将其分配给有符号的 8 位类型时byte,它被解释为-1遵循二进制补码规则。

于 2014-03-16T09:59:35.190 回答
1

试试这个,你就会明白:

System.out.println(Integer.toBinaryString(i)); // 11111111
System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111111
System.out.println(Integer.toBinaryString(c)); // 1111111111111111111111111111111

变量int i等于 255,所以第一次打印是有意义的。

变量byte b等于 -1,因为您将 255 存储在单个字节中。

  • 但是,当您调用 时Integer.toBinaryString(b),编译器会b从转换byteint,并且(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b,因此是第二次打印。

变量int cequals b>>>1,所以第三次打印是有意义的。

于 2014-03-16T10:11:32.493 回答
1

这就是您获得预期结果的方式

c = (0xFF & b) >>> 1;

有关详细信息,请参阅 dasblinkenlight 的答案

于 2014-03-16T10:01:45.233 回答