在java中被负数转移

Dip*_*ipu 4 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出: i = 4的值

Jon*_*eet 17

从JLS,第15.19节(班次运营商):

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

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

  • @Dipu:我在答案中明确地表明:规范说"好像右手操作数受到掩码值0x1f的按位逻辑AND运算符",然后将其应用于您的示例: `-63&0x1f`是1. (2认同)

MBy*_*ByD 5

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

\n\n

查看JLS \xc2\xa715.19 中的移位运算符行为。

\n