4

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

我想我正确理解了以下内容:

Input : 1 << 10
Output: 0000000000000000000010000000000

对于正数,我认为是您将 1 移动 10 位。

困惑是当我有以下情况时:

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

如果有人能用负数向我解释左移或右移的含义,那就太好了。

4

2 回答 2

9

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

在您的情况下,它是0b10110= 22

因此1 << (-10)等价于1 << 22

于 2013-09-12T18:26:47.893 回答
5

来自 JLS,第 15.19 节

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

换句话说,

1 << -10

相当于:

1 << (-10 & 0x1f)

...这是

1 << 22
于 2013-09-12T18:30:51.843 回答