java - 为什么移位运算符>>中的负数结果与正常除法不同?

标签 java bit-shift

我正在尝试理解轮类运算符的概念, 我正在测试以下代码:

15 >> 2;    
- 15 >> 2 

第一个语句的结果是 3,即 15/4=3 但第二条语句的结果是-4。

我知道-15的二进制是11110001,当我们向右移动2时,我们得到11111100,这是-4。但我不明白为什么结果与简单除法不同 -15/4= -3 而不是 -4?

请指导我为什么会发生这种情况?

最佳答案

移位运算符通过取整而不是截断来删除任何数学分数。 JLS, Section 15.19 ,状态:

The value of n >> s is n right-shifted s bit positions with sign-extension. The resulting value is floor(n / 2<sup>s</sup>). For non-negative values of n, this is equivalent to truncating integer division, as computed by the integer division operator /, by two to the power s.

地板-3.75-4而截断会产生 -3 .

当值右移时,位会丢失,因为它们移出了值的“末尾”。这是负责楼层操作的。

-15: 11110001
 -4: 11111100 // The rightmost 1 bit above is lost, resulting in what looks like the floor function.

关于java - 为什么移位运算符>>中的负数结果与正常除法不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812761/

相关文章:

c - c中的左移运算符

c - 为什么 1 << 3 等于 8 而不是 6?

c - 解释 v < 0 时的情况

java - ant-contrib:过时的问题

java - 在 Java 8 Stream 上执行操作时如何保留状态?

java - 我如何使用 HQL/Hibernate 验证我的所有表都是空的?

c - 为什么一个复杂的位移命令不像某些具有相同逻辑的命令那样起作用?

c - C中的按位问题

java - hibernate 一对一,没有给定标识符的行存在异常

java - 大米之谜 - 为什么 "If else"语句不能正确循环?