0

这是一个小例子。

    int a = 11; //1 0 1 1 is bit representation
    System.out.println(~a);

    Output: -12

据我了解,'~' 运算符会反转位 - 即 1 0 1 1 现在应该是 0 1 0 0 因此输出应该是 4。我错过了什么?

4

2 回答 2

5

11不表示为1011,表示为:-

0000 0000 0000 0000 0000 0000 0000 1011

只是你没有注意到看到领先0's。请记住,ints 是 32 位的。

现在,~11将是: -

1111 1111 1111 1111 1111 1111 1111 0100

所以,这是一个负数。所以,取它的 2 的补码,你会得到: -

0000 0000 0000 0000 0000 0000 0000 1011 // 1's complement
0000 0000 0000 0000 0000 0000 0000 1100 // 2's complement == -12

因此,你得到-12.

于 2013-01-31T05:59:38.207 回答
0

一个 int 比 4 多得多,它实际上在你输入的内容之前有一堆 0。

计算机上的负数通常表示为以 1 开头。a -1 通常是全一,-2 是 ..11111111111111110,-3 是 ..1111111111111101,等等。\

所以你得到的是一个负数,因为你把所有的零都改成了一。

如果您想查看您的号码,请使用 ~a & 0xf

0xf 会给你一个“掩码” ...000001111

与之相加的任何东西都只会保留最后 4 位,其余的都将被清零。

很好的问题,很高兴看到人们仍在尝试/思考这些东西。

于 2013-01-31T06:02:51.823 回答