4

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

4

5 回答 5

17

来自 JLS,第 15.19 节(移位运算符)

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

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

于 2012-05-09T13:10:14.893 回答
4

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

查看 JLS §15.19 中的移位运算符行为

于 2012-05-09T13:10:07.877 回答
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); 
于 2016-01-06T04:22:02.860 回答
0

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

r << -shift

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

(32 是 Java 中整数的大小)

于 2013-10-31T09:36:40.553 回答
0

用 -63 移位实际上是用-63 & 0x1f == 1for int 或-63 & 0x3f == 1for long 移位,因为在 Java 中左移>>使用符号扩展,在 8 的情况下,1 将移出任何零位。

于 2017-12-28T18:48:56.560 回答