Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的负数移位_Java_Bit Shift - Fatal编程技术网

java中的负数移位

java中的负数移位,java,bit-shift,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.printl

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

s=s>-63
类似于
s=s>>1(-63%32)

请参阅JLS§15.19中的

来自JLS,:

如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数接受了位逻辑AND运算符(§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31之间(包括0到31)


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

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

r << -shift

r对于int或
-63&0x3f==1
而言,使用-63移位实际上是使用
-63&0x1f==1
进行长时间移位,因为在Java中,使用
>
左移位使用符号扩展,在8的情况下,1将移出任何零位

谢谢你的回复,乔恩,但你能告诉我,我们如何才能认识到这必须是一个或两个轮班等等。所以请在这方面指导我。@Dipu:“认识到这必须是一个或两个轮班”是什么意思?你的问题很不清楚-你还没有告诉我们你想要实现什么。看jon我想知道我们怎么知道-63意味着一个一个的筛选。所以可能有一些技巧。我希望这能让你明白。@Dipu--63表示为
ffffff c1
,你在执行AND操作时,您得到
FFFFFFC1&0x0000001f==0x00000001
这是计算结果。数字-63的表示形式是2的补码。@Dipu:我在回答中明确指出:规范说“好像右侧操作数受掩码值为0x1f的位逻辑AND运算符的约束”,然后将其应用于示例:
-63&0x1f
为1。
r << ((32 - shift) % 32)
    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);