Operand1 ShiftOperator Operand2
移位规则
如果其中一个操作数是负数,请不要忘记计算其 2 的补码,因为负整数是使用 2 的补码存储在内存中的
用 0x1F 掩码 Operand2
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
感谢大家的支持!现在我有了更好的主意...:)
最佳答案
无论你从哪里得到它,它都是错误的。 Operand2 在用 0x1F 屏蔽后最左边的五位不可能是负数或有任何东西。 Java Language Specification 中没有任何内容关于取移位距离的二进制补码,或使用其最左边的五位。阅读它真正说的是什么。不要依赖任意来源,也不要随便编造。
编辑 -81814621 是 0xFFFFFFFFFFB1F9BA3,-12 是 0xFFFFFFFFFFFFFFFFF4,其后五位是 0x14 或 20,将第一个操作数右移 20 得到 0xFFFFFFFFFFFFFFB1,即 -79。
关于具有负操作数的 Java 按位移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23028977/