这是一个小例子。
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.我缺少什么?
答案 0 :(得分:5)
11
未表示为1011
,表示为: -
0000 0000 0000 0000 0000 0000 0000 1011
只是你不注意看到领先的0's
。请记住,int
是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
。
答案 1 :(得分:0)
一个int比4更多的数字,它实际上比你放的更多。
计算机上的负数通常表示为以1开头。 a -1通常都是1,-2是.111111111111111110,-3是..1111111111111101等。
所以你得到的是一个负数,因为你将所有这些零改为了。
如果您想查看号码,请使用~a& 0xf
0xf会给你一个“掩码”... 000001111
任何与此相关的东西只会保留最后4位,其余的都将被清零。
很好的问题,很高兴看到人们仍在尝试/想到这些东西。