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

时间:2015-05-01 05:50:06

标签: java scjp

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   
------------------------------

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你开始时是-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)

答案 2 :(得分:0)

我还没有做过多少事情,但是在阅读维基百科几秒后看起来似乎不是-5 = 4,在维基百科上他们使用 NOT x = -x - 1 。所以程序是正确的。

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