invert 的作用是对数值按位取反,但是对于具体的情况有点差别,看下面几个例子就能明白。
对于正数 13,其对应的二进制位是:00001101,如果按位取反,结果为 11110010 对应的整数是:-14。
二进制位,可以用numpy的 np.binary_repr 函数实现:
可是设置不同的位数:
-14是怎么来的呢?计算机中,最高位是符号位。11110010的最高位是1,代表负数。而负数在计算机中是负数按照补码来进行存储的。
我们可以这么说,对于负数才有相应的补码。
补码的计算方式:补码 = 反码 + 1。
而我们最终的目的是要得到原码,也就是反码的反码。
对于补码 11110010,我们先求的反码,为反码 = 补码 - 1 = 11110001
然后求取,原码:原码是反码的反码,但是符号位不变: 原码 = 10001110 对饮过来就是 -14 啦。
测试结果:
但是对于无符号整数,我们对正数求求反码时,不改变符号位:所以 00001101的反码为 11110010 最高位默认强制为0,按位取反后还是正数,对应是 242。
对于更大的比特位,有符号正数不变,但是无符号整数 结果会变化。看下面两个例子。
16位有符号整数
16位无符号整数(计算过程同uint8)
对于 bool行数据,就直接取反即可。
参考:https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.invert.html