2016-12-01 123 views
1

我一直在使用Java获得一个奇怪的问题,并且已经在Windows和Mac系统上进行了测试,并且一直出现这个问题。Java位运算符(零填充移位)不填充零

看看这段代码

int a = -32; //11100000 as per two's complement 
System.out.println(a >>> 2); 

我希望这个代码产生56,这是它的二进制形式00111000。但是,它会以二进制形式生成值1073741816,111111111111111111111111111000。我知道整数是32位的Java,但设置字节的类型也是一样的。

但是如果我声明一个二进制文字这样

int b = 0b11100000; 
System.out.println(b); 
System.out.println(b >>> 2); 

第一语句产生的值224(预期-32),而第二个语句产生的56

预期值我要去疯?

+0

使用'Integer.toBinaryString()'或类似的方法调试可能会更容易 –

回答

1

b你的位模式是不是11100000像你说的,但11111111 11111111 11111111 11100000

您使用的int这是32位 - 而不是一个字节 - 并使用二进制文字不会改变这一点。

即使您使用的是byte而非int它也不能解决您的问题,因为Java位移运算符首先将小于32位的任何类型提升为32位。

所以最终的位模式是00111111 11111111 11111111 11111000转变后。

如果你想模仿与8位值的工作,你需要运用位位移前位掩码的32位值的低8位(您不妨使用>>而非>>>现在)

System.out.println((b & 0xff) >>> 2);