具有负操作数的 Java 按位移位运算符

标签 java bitwise-operators negative-number

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/

相关文章:

java - 如何在 QuickFix 上发送和接收消息?

java - 通过 Basex 中的 java api 打印 XQuery 信息

python - 逻辑与按位运算符 AND

数字实例的 Java 负数

java - 扩展 JUnit assertEquals

java - 在日志系统中分离生命周期事件的适当方法是什么?

go - golang 中的 ^0 是什么?

c - 通过位操作获取 INT_MAX

c - 为什么条件语句中负数被视为真?