为什么在Java中-1右移1 = -1?

5 java bit-manipulation

我遇到了一个问题"为什么-1是零填充右移1 = 2147483647对于Java中的整数?"

从上面的问题的答案中我完全理解了零填充右移的概念.但是当我试图找到-1 >> 1时,我得到了一个非常复杂的答案,我觉得很难理解.

-1 in binary form is as follows: 11111111111111111111111111111111
After flipping the bits, I got:  00000000000000000000000000000000
Upon adding 1 to it, I got:      00000000000000000000000000000001
Now shifting one position right: 00000000000000000000000000000000 
After flipping the bits, I got:  11111111111111111111111111111111
Now adding 1 to it:              00000000000000000000000000000000

我不明白-1 >> 1本身是-1,那么?

Seb*_*olm 5

当您进行正常的右移(即使用>>,也称为算术右移,而不是>>>逻辑右移)时,数字将被符号扩展

其工作原理如下:

当我们右移时,我们会在数字前面得到一个空位,如下所示:

 11111111111111111111111111111111
 ?1111111111111111111111111111111(1)  (right-shift it one place)
Run Code Online (Sandbox Code Playgroud)

最后一个1移出,然后移入?

现在,我们如何填写?取决于我们如何转变。

如果我们进行逻辑移位(即>>>),我们只需将其填充为0。如果我们进行算术移位(即>>),我们用原始数字的第一位(即符号位)填充它(因为它是1数字是否为负数,0如果不是)。这称为符号扩展。

因此,在这种情况下,-1 >> 1将 符号扩展1?,保留原始-1

进一步阅读:

  • 也许有趣的是,由于符号扩展,右移运算在算术上也是除以二的负值! (2认同)