晚上的时候,无心之间看到stackoverflow上面的一个编程挑战赛,各路高手各类搞事,看到python的地方忽然发现用了不少位运算的符号,可是~符号引发了我和同事的注意。python
咱们不多在程序中使用这种东西,一个是可读性问题,二是感受不是很熟练因而兴致来了,便探究一番~取反运算。编程
首先看看行为spa
In [1]: ~3
Out[1]: -4
取反3等于-4,那么是如何进行计算的呢?code
首先咱们知道3的二进制用8bit表示为 0000 0011 那么对这个数进行二进制取反获得 1111 1100 这点来讲应该不会有什么理解上的问题。blog
可是到这里,若是已经忘记或者不知道负数在计算机中是以补码形式表示的盆友(好比我这个菜🐔)就会疑惑了 1111 1100 并非-4啊???怎么回事。源码
如今计算机广泛使用补码表示负数,因此如今问题变成了 一个数x的补码等于1111 1100 咱们要求这个x。it
知道一个数的补码 要求其值的方法是 首先看符号位也就是最左的一位,若是是1表明是负数(-)若是是0代码是正数(+),而后对该值取反+1获得其源码class
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