我对这个表达很困惑。我是一名Java程序员,但我并不精通位操作。
我认为我正确地理解了以下内容:
Input : 1 << 10
Output: 0000000000000000000010000000000
对于正数,我认为你是1乘10位。
当我有以下内容时会产生困惑:
int val = -10 (binary representation : 1111111111111111111111111110110 )
Input : 1 << val
Output: 0000000010000000000000000000000
如果有人可以通过负数向我解释左移或右移的含义,那将是非常好的。
答案 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