我在Java中有移位运算符的问题。我使用了以下代码,并且无法理解该程序如何生成此输出。所以请指导我该程序如何生成此输出。
public class Operator {
public static void main(String[] args) {
// TODO Auto-generated method stub
int s = 8;
s = s >>-63;
System.out.println("value of i=" + s);
}
}
输出:i = 4的值
来自JLS,section 15.19 (Shift Operators):
如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x1f(0b11111)的影响。因此,实际使用的移位距离始终在0到31的范围内,包括0和31。
现在-63 & 0x1f == 1
,所以这实际上是向右移1,因此4的答案。
s = s >>-63;
就像s = s >> 1;
(-63%32)
在JLS§15.19上查看shift operator behavior。
int s=8;
Assert.assertEquals(s >>-63, s >>-63 % 32);
Assert.assertEquals(s >>-63, s >>-31);
Assert.assertEquals(s >>-31, s >>32 -31);
Assert.assertEquals(s >>32 -31,s >>1);
Assert.assertEquals(s >>1,s /2);
Assert.assertEquals(s/2,4);
如果要替换负移位,以下两个语句为整数产生一个相同的结果:
r << -shift
和
r << ((32 - shift) % 32)
(32是Java中整数的大小)
与-63一起移位实际上随着-63 & 0x1f == 1
移位为int或-63 & 0x3f == 1
很长时间,因为在Java中左移>>
使用符号扩展,并且1将在8的情况下移出任何零位。