我如何计算-5的否定(〜)

How do I calculate negation(~) of -5

public class UnaryOperator {
    public static void main(String[] args) {
        byte a= -5;
        System.out.println(~a); // prints 4
    }
}

当我手动计算时,我得到的答案是 6。

我是这样做的:

128 64 32 16 8 4 2 1
 0  0  0  0  0 1 0 1

因为它是一个否定,所以我将其反转为以下内容:

         128 64 32 16 8 4 2 1
          0  0  0  0  0 1 0 1
    sign -1  1  1  1  1 0 1 0

-----------------------------
             0  0  0  0 1 0 1
add one-->   0  0  0  0 0 1 1  

------------------------------
             0  0  0  0 1 1 0 = 6   
------------------------------

我知道我正在做的事情有问题,但我无法弄清楚。

5 是 00000101
-5 是 11111010+00000001 = 11111011
~(-5) 是 00000100
所以你得到 4.

我没有做太多按位的事情,但在阅读维基百科几秒钟后,它似乎不是 -5 = 4,在维基百科上他们使用 NOT x = -x - 1.所以程序是正确的。

编辑:对于无符号整数,您使用 NOT x = y - x,其中 y 是整数可以容纳的最大数。

您从 -5 开始,它是二进制补码。因此:

    -128 64 32 16 8 4 2 1
      1  1  1  1  1 0 1 1 (= -5)
flip: 0  0  0  0  0 1 0 0 (= +4)