-1如何除以2得出-1? (按位运算>>)

问题描述 投票:1回答:1

我很惊讶地看到,使用按位运算将-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);
    }
  }

https://javafiddle.leaningtech.com/

java bitwise-operators
1个回答
3
投票

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,并且在所有情况下都不应将右移视为相等

© www.soinside.com 2019 - 2024. All rights reserved.