这是一个小例子。
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。我错过了什么?
这是一个小例子。
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。我错过了什么?
11
不表示为1011
,表示为:-
0000 0000 0000 0000 0000 0000 0000 1011
只是你没有注意到看到领先0's
。请记住,int
s 是 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
.
一个 int 比 4 多得多,它实际上在你输入的内容之前有一堆 0。
计算机上的负数通常表示为以 1 开头。a -1 通常是全一,-2 是 ..11111111111111110,-3 是 ..1111111111111101,等等。\
所以你得到的是一个负数,因为你把所有的零都改成了一。
如果您想查看您的号码,请使用 ~a & 0xf
0xf 会给你一个“掩码” ...000001111
与之相加的任何东西都只会保留最后 4 位,其余的都将被清零。
很好的问题,很高兴看到人们仍在尝试/思考这些东西。