Java中的Shift运算符

时间:2013-11-11 05:39:58

标签: java bit-shift

当移位位的值大于数据类型的总位数时,移位运算符<<如何工作?

例如,

int i = 2; 
int j = i<<34;
System.out.println(j);

整数的大小是32位,但是我们正在移位34位。这是如何工作的?

3 个答案:

答案 0 :(得分:6)

我不确定这方面的来源,但根据WikiPedia(强调我的):

  

如果左侧操作数的提升类型为int,则只有五   右侧操作数的最低位用作移位   距离即可。好像右手操作数受到了a   按位逻辑AND运算符&amp;掩码值为0x1f(0b11111)。[4]   因此,实际使用的移位距离始终在0到0的范围内   31,包容性。

编辑:看起来WikiPedia条目基本上直接从Java Specification提取信息。

答案 1 :(得分:4)

使用&lt;&lt;移位整数时或&gt;&gt;操作员和移位距离大于或等于32,你采用移位距离mod 32(换句话说,你屏蔽除了移位距离的低5位以外的所有距离)。

这可能非常违反直觉。 For example (i >> 32) == i,对于每个整数i。您可能希望它将整个数字向右移动,正输入返回0,负输入返回-1,但不是;它只是返回i,因为 (i << (32 & 0x1f)) == (i << 0) == i

回到原来的问题,(i&lt;&lt; 33)==(i&lt;&lt;(33&amp; 0x1f)) ==(i <&lt; 1)。如果你愿意,你可以用二进制做整件事。二进制270是:0000 0000 0000 0000 0000 0001 0000 1110向右移动1, 得到:0000 0000 0000 0000 0000 0000 1000 0111,这是135。

但是,在你的头脑中解决这个问题的一个更好的方法是完全免除二进制文件。 i >> s is floor(i / 2<sup>s</sup>)的值(其中s已被屏蔽,因此小于32)。所以,270 << 1 = floor(270/2) = 135

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19

答案 2 :(得分:1)

如果您尝试1 << 34,最终会得到4。运行时在shift的右侧操作数上基本上有一个隐式mod NUMBER_OF_BITS。在上一个示例中,它是1 << (34 % 32),变为1 << 2,即4。