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

为什么在Java中-1右移1=-1?,java,bit-manipulation,Java,Bit Manipulation,我遇到了这个问题 从上述问题的答案中,我完全理解了零填充右移的概念。但是当我试图找到-1>>1时,我得到了一个非常复杂的答案,我觉得很难理解 -1 in binary form is as follows: 11111111111111111111111111111111 After flipping the bits, I got: 00000000000000000000000000000000 Upon adding 1 to it, I got: 00000000000000

我遇到了这个问题

从上述问题的答案中,我完全理解了零填充右移的概念。但是当我试图找到-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如下所示:11111111111111111111111 在翻转位之后,我得到:00000000000000000000 在添加1后,我得到:00000000000000000000000000000001 现在右移一个位置:00000000000000000000 在翻转位之后,我得到:11111111111111111111 现在添加1:00000000000000000000
我不明白-1>>1本身是如何-1的,那么?

>
是一个“有符号右移”运算符,因此它将保留最左边的位

因此,由于
-1
(dec)是
0xB11111111111111111111111
(bin),使用
>
将其右移将保留
1
,结果再次是
0xB11111111111111111
(bin)


对于无符号右移,可以使用运算符
>
。它总是用零(0)填充。在您的情况下,
-1>>1
会导致
0B01111111111111111111111
,或
2147483647
,这是最大可能的(正)32位2的补码(并且等于
整数。最大值
)。

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

其工作原理如下:

当我们右移时,数字前面有一个空白点,如下所示:

 11111111111111111111111111111111
 ?1111111111111111111111111111111(1)  (right-shift it one place)
最后一个
1
被移出,而
被移入

现在,我们如何填写
取决于我们如何转换

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

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

进一步阅读:

那么-2>>1的情况如何?我的意思是-2算术移位1的结果根据您的逻辑被卡住了。请也用-2作为例子来解释您的答案。@AbyWang:-我们将
0
从右侧移开,并在前面扩展一个
1
,给出
-1
。这可能是因为符号扩展右移操作在算术上也是负值的二除运算!…它总是向下舍入,与向零舍入的普通整数除法相反。因此
-1/2=-0.5
向下舍入为
-1