我很惊讶地看到,使用按位运算将-1除以2得到-1。
我期望返回0。
就像将1或-1除以2一样,小数部分将被删除,我们得到零。这可能与Two的补码有关,但这只是一种猜测,而我对此并不完全理解。
有人可以解释吗?
-1 >> 1 = -1
-1/2 = 0
public class JavaFiddle
{
public static void main(String[] args)
{
System.out.println(-1 >> 1);
System.out.println(-1 / 2);
}
}
java中的负数使用称为2's complement的符号表示。如果我们假设有符号整数的大小为8,您可以这样想2的补码]
2 will be 00000010
1 will be 00000001
0 will be 00000000
-1 will be 11111111 (Count in reverse from max)
-2 will be 11111110
-3 will be 11111101
(实际上,在Java中int
的大小为4个字节)
>>
这是按位右移运算符。根据documentation,对于正数,它在最左边的位置填充0;对于负数,它将用1填充相同的位置。
这意味着将-1移位任意次数只会得到-1。
11111111 >> 1 = 11111111
这是因为Non-equivalence of arithmetic right shift and division的含义是负数除以2,并且在所有情况下都不应将右移视为相等