为什么在Java中-1右移1=-1?
我遇到了这个问题 从上述问题的答案中,我完全理解了零填充右移的概念。但是当我试图找到-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为什么在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的,那么?
>
是一个“有符号右移”运算符,因此它将保留最左边的位
因此,由于-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
进一步阅读:
0
从右侧移开,并在前面扩展一个1
,给出-1
。这可能是因为符号扩展右移操作在算术上也是负值的二除运算!…它总是向下舍入,与向零舍入的普通整数除法相反。因此-1/2=-0.5
向下舍入为-1
。