位移问题

时间:2013-03-18 19:16:04

标签: java

鉴于以下代码:

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&lt;&lt; = 32)是1。

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

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

任何人都可以解释一下吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

  

任何人都可以解释一下吗?

绝对。基本上,int上的移位操作掩盖了右操作数以获得[0,31]范围内的值。 long上的移位操作将其屏蔽,以获得[0,63]范围内的值。

所以:

num <<= 32;

相当于:

num <<= 0;

来自section 15.19 of the JLS

  

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

答案 1 :(得分:0)

对于int上的位移操作符,仅限5 lowest order bits are used。所以<< 32什么都不做;它相当于<< 0,因为32的最后5位是0.但是循环中的<< 1操作都按预期执行。