按位运算得到负值

时间:2014-12-15 06:07:32

标签: java

我有这段代码:

 int code = 0x92011202;
 int a = (code & 0xF0000000) >> 28;
 int b = (code & 0x0F000000) >> 24;
 // ..
 int n = (code & 0x0000000F);

但如果code的最高有效位等于1(从9到F)a为负值。所有其他变量  工作正常。

为什么会这样?

3 个答案:

答案 0 :(得分:5)

The Java Tutorials中解释了这一点。

具体来说:

  

无符号右移运算符">>>"将零转换为   最左边的位置,而在">>"之后的最左边的位置依赖于取决于   签署延期。

Java使用2s补码变量。你关心的2s补充的唯一方面是,如果最左边的位是1,则数字是负数。带符号的bitshift保持符号,因此如果代码为负值,则在移位后保持为负。

要修复程序,请使用>>>代替逻辑位移,忽略符号

答案 1 :(得分:0)

最重要的代码代表符号 - 0表示数字为正数,1表示数字为负数。

如果你打印出代码,你会发现它是否定的。

由于班次操作员考虑了符号(它是有符号的班次),如果代码为负,则a将得到负值。

答案 2 :(得分:-1)

“int”的最大值是2 ^ 31-1。 0xF0000000是负数。任何最高有效位等于1的数字都是负数。