在java中被负数转移

时间:2012-05-09 13:07:37

标签: java bit-shift

我在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

5 个答案:

答案 0 :(得分:17)

来自JLS,section 15.19 (Shift Operators)

  

如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符& (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。

现在-63 & 0x1f == 1,所以这实际上是向右移1,因此得到4的答案。

答案 1 :(得分:4)

s = s >>-63;就像s = s >> 1;( - 63%32)

在JLS§15.19上查看shift operator behavior

答案 2 :(得分:1)

    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); 

答案 3 :(得分:0)

如果要替换负移位,以下两个语句对整数产生一个相同的结果:

r << -shift

r << ((32 - shift) % 32)

(32是Java中整数的大小)

答案 4 :(得分:0)

使用-63移位实际上会以var files = from file in Directory.EnumerateFiles(contentManager.RootDirectory + "/" + contentFolder, "*.xnb", SearchOption.AllDirectories) select file; 移位int或-63 & 0x1f == 1很长一段时间,因为在Java中左移-63 & 0x3f == 1使用符号扩展,1将移出任何零位在8的情况下。