鉴于以下代码:
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次,结果不同。
任何人都可以解释一下吗?
提前致谢。
答案 0 :(得分:5)
任何人都可以解释一下吗?
绝对。基本上,int
上的移位操作掩盖了右操作数以获得[0,31]范围内的值。 long
上的移位操作将其屏蔽,以获得[0,63]范围内的值。
所以:
num <<= 32;
相当于:
num <<= 0;
如果左侧操作数的提升类型为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
操作都按预期执行。