在java中被负数转移

我在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, 第15.19节(class次运营商) :

如果左侧操作数的提升类型是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中查看class次操作员行为 。

  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为long,因为在Java中左移>>使用符号扩展,1将移出任何零位案例8。