2014-04-12 66 views
1

OPERAND1 ShiftOperator Operand2中与负操作数的Java按位移位运算符

换档规则

  • 如果两个操作数为负,不要忘记来计算,因为负的2的补使用2的补码将整数存储在内存中

  • 掩码操作数2为0 x1F的

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 

感谢您的支持!现在我对它有更好的想法...... :)

+0

你了解'>>'和'>>>'的区别吗? –

+0

任何人都可以解释它-81814621 >> - 12 = -79 AND -81814621 >>> - 12 = 4017它如何得到计算而不是理论解释... –

+0

它完全按照JLS中所述进行计算。不是根据你上面描述的。 – EJP

回答

3

无论你从哪里得到,都是错误的。在用0x1F掩码之后,Operand2不可能是负数,或者最左边的5位中没有任何东西。 Java Language Specification中没有任何关于移位距离的二进制补码或使用其最左边的五位。阅读它的真实内容。不要依赖任意的来源,或者只是补充。

EDIT -81814621是0xFFFFFFFFFB1F9BA3,-12是0xFFFFFFFFFFFFFFF4,那是0×14或20底部五个位,由20中的第一操作数右移给出0xFFFFFFFFFFFFFFB1,这是-79。

+0

EJP,谢谢!你能再帮我一个忙吗?-81814621 >>> -12 = 4017 –

+0

如果你自己完成这项工作,它将会更加有利,唯一不同的是上面没有符号传播的问题。>>> – EJP

+0

-81814621 >>> - 12 = 4017 -81814621 = FB1F 9BA3 -12 = FFFF FFF4 = FFFF FF {1111} 4 =最后5位0x14 = 20 -81814621 >>> - 12 = FB1 = 4017 谢谢EJP –

2

关于如何处理右移操作符的“规则”在那里,因为右操作数值的列表真正有意义非常短:对于int s,范围从0到31,包括0和31。对于long s,它从零到63.

右侧的int的所有其他值都需要转换为指定范围内的值。 “规则”阐明了这一过程 - 即将数字重新解释为正数(这就是二进制补码的含义),然后掩盖掉高位,保留最后五位。

相反,左操作数可以保留其全部范围。您遇到的唯一区别与>>>>>之间的区别,即在将左侧操作数解释为有符号移位的操作符与将其解释为无符号的操作符之间存在差异。

>>>运营商背后的目的在this answer中解释。在你的例子中,当你向两个操作员右移一个负数时,>>通过叹息扩大它(即左移),而>>>通过移入零使它成为正数。