Python的按位补码操作符(~)是如何工作的?

216 投票
19 回答
244237 浏览
提问于 2025-04-15 11:15

为什么大约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的二进制补码表示。

补码运算符(~)只是用来取反位。具体怎么解读这些位是由计算机来决定的。

撰写回答