java中的负数移位
我对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
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);