1

给定以下代码:

public class Something {
public static void main(String[] args) {
    int num = 1;

    num <<= 32;
    System.out.println(num); 

    num = 1;
    for (int i = 0 ; i < 32; i++)
        num <<= 1;
    System.out.println(num);
}
}

第一个输出(来自 num <<= 32)是 1。

第二个输出(来自 for 循环)是 0。

我不明白..它对我来说看起来一样..两种方式都将“1”数字(lsb)移动了32次,结果不同。

谁能解释一下?

提前致谢。

4

2 回答 2

5

谁能解释一下?

绝对地。基本上,移位操作对int正确的操作数进行掩码,以获得 [0, 31] 范围内的值。移位操作long将其屏蔽以获取 [0, 63] 范围内的值。

所以:

num <<= 32;

相当于:

num <<= 0;

JLS 的第 15.19 节

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

于 2013-03-18T19:17:47.240 回答
0

对于位移位运算符int,仅使用5 个最低位。什么<< 32也不做;它相当于<< 0,因为 32 的最后 5 位是 0。但是<< 1循环中的操作每个都按预期执行。

于 2013-03-18T19:18:35.717 回答