Python的按位补码操作符(~)是如何工作的?
为什么大约2等于-3?~
这个符号是怎么工作的?
19 个回答
21
正如其他人提到的,~
这个符号就是把数字的每一位反转,也就是把1变成0,把0变成1。因为我们使用的是二进制补码,所以你看到的结果就是这样来的。
这里有一点要补充,就是为什么要用二进制补码。这样做的目的是为了让负数的运算和正数的运算一样。你可以把 -3
想象成一个数字,想要得到零就得把 3
加上去。这个数字是 1101
,记住,二进制加法就像小学学的十进制加法,只不过当你加到2的时候要进位,而不是加到10。
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
所以 1101
就代表 -3
,把每一位反转后你会得到 0010
,这就是2。
45
~
这个符号的作用是翻转数值中的每一个二进制位。
为什么 ~2
会变成 -3
,这和数字的二进制表示方式有关。数字是用一种叫做二进制补码的方式来表示的。
所以,数字2在二进制中是:
00000010
而 ~2
翻转了这些二进制位,所以现在的值是:
11111101
这就是-3的二进制表示。
323
记住,负数是通过正数的二进制补码来存储的。举个例子,-2在二进制补码中的表示是这样的:(8位)
1111 1110
得到这个结果的方法是先找到一个数字的二进制表示,然后把所有的位取反(也就是把0变成1,把1变成0),最后再加1。比如2的二进制是0000 0010,取反后变成1111 1101,加1后就得到了上面的结果。最前面的那一位是符号位,表示这是一个负数。
接下来我们看看如何得到~2 = -3:
这里是2的表示:
0000 0010
只需把所有的位取反,我们就得到:
1111 1101
那么,-3在二进制补码中是什么样子的呢?先从正数3开始:0000 0011,取反得到1111 1100,然后加1就变成负数(-3),也就是1111 1101。
所以,如果你只是把2的位取反,就得到了-3的二进制补码表示。