晚上的时候,无意之间看到stackoverflow上面的一个编程挑战赛,各路高手各种搞事,看到python的地方突然发现用了很多位运算的符号,但是~符号引起了我和同事的注意。

我们很少在程序中使用这种东西,一个是可读性问题,二是感觉不是很熟练于是兴致来了,便探究一番~按位取反运算(注意这是一个运算符,跟反码不是一个东西)。

 

首先看看行为

In [1]: ~3
Out[1]: -4

取反3等于-4,那么是如何进行计算的呢?

 

首先我们知道3的二进制用8bit表示为 0000 0011 那么对这个数进行二进制取反得到 1111 1100 这点来说应该不会有什么理解上的问题。

但是到这里,如果已经忘记或者不知道负数在计算机中是以补码形式表示的盆友(比如我这个菜🐔)就会疑惑了 1111 1100 并不是-4啊???怎么回事。

现在计算机普遍使用补码表示负数,所以现在问题变成了 一个数x的补码等于1111 1100 我们要求这个x。

知道一个数的补码 要求其值的方法是 首先看符号位也就是最左的一位,如果是1代表是负数(-)如果是0代码是正数(+),然后对该值取反+1得到其源码

1111 1100 取反 0000 0011 + 1 = 0000 0100 加上符号- 0000 0100 = -4

 

搞清楚了吗? 没有? 我们再看看个负数的反码

In [3]: ~-4
Out[3]: 3

首先-4 的表示是使用了4的补码 也就是 0000 0100 的补码 1111 1100表示,在计算机存储中这个数表示-4。

然后我们取-4的反码 也就是取1111 1100的反码

1111 1100 取反 0000 0011 结果等于3 

 

Reference:

《计算机科学导论》--Behrouz A.Forouzan