2013-03-18 30 views
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

和(用于环路从)所述第二输出是0。

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

任何人都可以解释吗?

在此先感谢。

回答

5

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

绝对。基本上,int上的移位操作具有被屏蔽的右操作数以获得范围[0,31]中的值。 long上的移位操作会将其屏蔽以获取范围[0,63]中的值。

所以:

num <<= 32; 

等同于:

num <<= 0; 

section 15.19 of the JLS

如果左侧操作数升级后的类型为int,只有五个最低使用右侧操作数的位数作为移位距离。就好像右侧的操作数受掩码值0x1f(0b11111)的按位逻辑AND运算符&(第15.22.1节)的处理。实际使用的换档距离总是在0到31的范围内。

+0

有关更多详细信息,请参见[JLS 15.19](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19)。 – 2013-03-18 19:18:22

+0

@LouisWasserman:是的,正在那里:) – 2013-03-18 19:18:57

+0

完美。非常感谢你。得到它了。 – Rouki 2013-03-18 19:19:30

0

有关int,只有5 lowest order bits are used比特移位运算符。所以<< 32什么都不做;它相当于<< 0,因为32的最后5位是0.但循环中的<< 1操作每个都按预期执行。