按负数移位

时间:2013-09-12 18:23:52

标签: java bit-manipulation bit bit-shift

我对这个表达很困惑。我是一名Java程序员,但我并不精通位操作。

我认为我正确地理解了以下内容:

Input : 1 << 10
Output: 0000000000000000000010000000000

对于正数,我认为你是1乘10位。

当我有以下内容时会产生困惑:

int val = -10 (binary representation : 1111111111111111111111111110110 )
Input : 1 << val
Output: 0000000010000000000000000000000 

如果有人可以通过负数向我解释左移或右移的含义,那将是非常好的。

2 个答案:

答案 0 :(得分:8)

<<(和其他移位运算符)只需要int的右操作数的5个最低有效位,long只有6个,因为移位{{1}是没有意义的超过31。

在您的情况下,int = 0b10110

因此22相当于1 << (-10)

答案 1 :(得分:5)

来自JLS,section 15.19

  

如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。

换句话说,

1 << -10

相当于:

1 << (-10 & 0x1f)

......这是

1 << 22