带负操作数的Java逐位移位运算符

带负操作数的Java逐位移位运算符,java,bitwise-operators,negative-number,Java,Bitwise Operators,Negative Number,操作数1移位运算符操作数2 移位规则 如果任何一个操作数为负,不要忘记计算其2的补码,因为负整数是使用2的补码存储在内存中的 使用0x1F屏蔽操作数2 谢谢大家的支持!现在我有了一个更好的想法……:关于移位的右边运算符的处理规则是存在的,因为真正有意义的右操作数的值列表非常短:对于整数,范围是从零到31,包括在内;对于long,它是0到63 右侧的所有其他int值需要转换为指定范围内的值。该规则详细说明了这个过程——即,将数字重新解释为正数,这就是二者的补码,然后屏蔽较高的位,保留最后五位 相反

操作数1移位运算符操作数2

移位规则

如果任何一个操作数为负,不要忘记计算其2的补码,因为负整数是使用2的补码存储在内存中的

使用0x1F屏蔽操作数2


谢谢大家的支持!现在我有了一个更好的想法……:

关于移位的右边运算符的处理规则是存在的,因为真正有意义的右操作数的值列表非常短:对于整数,范围是从零到31,包括在内;对于long,它是0到63

右侧的所有其他int值需要转换为指定范围内的值。该规则详细说明了这个过程——即,将数字重新解释为正数,这就是二者的补码,然后屏蔽较高的位,保留最后五位

相反,左操作数可以保留其完整范围。您所经历的唯一差异与>>和>>>之间的差异有关,即将左侧操作数解释为有符号移位的运算符与将其解释为无符号移位的运算符之间的差异


中解释了>>>运算符的用途。在您的示例中,当您使用两个运算符右移负数时,>>通过扩展符号将数字保留为负数,即在左侧移动1,而>>>通过在零中移动使其为正。

关于如何处理移位的右侧运算符的规则是存在的,因为真正有意义的右操作数的值列表非常短:对于int,范围是从0到31,包含全部费用对于long,它是0到63

右侧的所有其他int值需要转换为指定范围内的值。该规则详细说明了这个过程——即,将数字重新解释为正数,这就是二者的补码,然后屏蔽较高的位,保留最后五位

相反,左操作数可以保留其完整范围。您所经历的唯一差异与>>和>>>之间的差异有关,即将左侧操作数解释为有符号移位的运算符与将其解释为无符号移位的运算符之间的差异


中解释了>>>运算符的用途。在您的示例中,当您使用两个运算符将负数右移时,>>会通过扩展使负数保持为负数,即在左侧移动一个,而>>>通过在零中移动使负数保持为正数。

无论从何处获得该值,都是错误的。在使用0x1F对操作数2进行掩蔽后,操作数2不可能为负数,也不可能在其最左边的五位中有任何内容。在这个例子中,并没有关于获取移位距离的两个补码,或者使用其最左边的五位。看看它到底说了什么。不要依赖武断的消息来源,或者只是弥补


编辑-81814621是0xFFFFFFFB1F9BA3,-12是0xFFFFFFFFF4,其底部五位是0x14或20,将第一个操作数右移20得到0xFFFFFFFFB1,即-79。

无论从何处得到,都是错误的。在使用0x1F对操作数2进行掩蔽后,操作数2不可能为负数,也不可能在其最左边的五位中有任何内容。在这个例子中,并没有关于获取移位距离的两个补码,或者使用其最左边的五位。看看它到底说了什么。不要依赖武断的消息来源,或者只是弥补


编辑-81814621是0xFFFFFFFB1F9BA3,-12是0xFFFFFFFFF4,其底部五位是0x14或20,将第一个操作数右移20得到0xFFFFFFFFFFB1,也就是-79。

你理解>>和>>>之间的区别吗?有人能解释一下吗-81814621>>-12=-79和-81814621>>-12=4017它是如何计算出来的,而不是理论上的解释……它的计算方法与JLS中描述的完全一样。不是根据你上面描述的。我发现如果操作数2是负数,那么计算它是2的补码非常容易混淆。这可能意味着你否定了它,这与发生的事情并不接近。它也可以被理解为我认为你的意思,你把数字放在2的补码表示中。。但是你已经有了2的补码表示法。@Harold,如果操作数2是负数,那么计算它是我提到的2的补码,以避免混淆说>>-5不要误以为你将用5移位,它是-5,所以如果我们在你的程序中,它内部只取-52的补码5,但是当我们检查假设5时,我们将得到不同的结果。与-873>>相同,您理解>>和>>>之间的区别吗?有人能解释它吗-81814621>>-12=-79和-81814621>>-12=4017它是如何计算出来的,而不是理论上的解释…它的计算方法与JLS中描述的完全相同。不是根据你上面描述的,我发现
ng如果操作数2为负数,则计算它的补码非常容易混淆。这可能意味着你否定了它,这与发生的事情并不接近。它也可以被理解为我认为你的意思,你把数字放在2的补码表示中。。但是你已经有了2的补码表示法。@Harold,如果操作数2是负数,那么计算它是我提到的2的补码,以避免混淆说>>-5不要误以为你将用5移位,它是-5,所以如果我们在你的程序中,它内部只取-52的补码5,但是当我们检查假设5时,我们将得到不同的结果。同样适用于-873>>EJP,谢谢!你能再帮我一次忙,把这个-81814621>>>-12=4017转换成-81814621>>>-12=4017,如果你自己完成的话,会受益更多。唯一不同于上面的是缺少符号传播的>>.-81814621>>-12=4017-81814621=FB1F 9BA3-12=FFFF FFF4=FFFF{1111}4=最后5位0x14=20-81814621>-12=FB1=4017谢谢EJP,谢谢!你能再帮我一次忙,把这个-81814621>>>-12=4017转换成-81814621>>>-12=4017,如果你自己完成的话,会受益更多。与上面不同的唯一一件事是缺少符号传播,通过>>>.-81814621>>>-12=4017-81814621=FB1F 9BA3-12=FFFF FFF4=FFFF FF{1111}4=最后5位0x14=20-81814621>-12=FB1=4017感谢EJP
Right shift 
81814621>>-12 = 78
81814621>>>-12 = 78 

OK!!



Right shift (Operand1 is NEGATIVE)
-81814621>>-12 = -79
-81814621>>>-12 = 4017

Why different?
Left shift 
21<<-12 = 22020096
-21<<-12 = -22020096 
Unlike Right shift no matter Operand1 is Positive/Negative  
only sign get changed instead value