我试图理解移位运算符的概念,我正在测试以下代码:
15 >> 2;
- 15 >> 2
第一个语句的结果是3为15/4 = 3,但第二个语句的结果是-4。
我知道-15的二进制数是11110001,当我们向右移动2时,我们有11111100,这是-4。但是我并不感到不安,为什么结果不同于-15 / 4 = -3而不是-4的简单除法?
请指导我为什么会这样?
移位运算符通过取底而不是截断来丢弃任何数学分数。 JLS, Section 15.19,指出:
n >> s
的值是带有符号扩展的n
右移s
位位置。结果值是floor(n / 2s)
。对于n
的非负值,这相当于将由整数除法运算符/
计算的整数除法截断为幂s
的2。
-3.75
的地板是-4
,而截断将产生-3
。
当值右移时,位会在值“偏离结束”时丢失。这是负责地板操作的原因。
-15: 11110001
-4: 11111100 // The rightmost 1 bit above is lost, resulting in what looks like the floor function.
Java使用two's complement来表示负数。 在二进制补码二进制数上向右移位n位具有将其除以2n的效果,但它总是向下舍入(朝向负无穷大)。这与通常在有符号整数除法(向0舍入)中进行舍入的方式不同。