反码,补码,还有0xffffffff到底是什么,今天仔细学!!!
一,反码
例如 2,二进制为‘0b(30个0)10’。反码就是把其中0变成1,1变成0。
那就是 要使用(异或),因为0^1 = 1, 1^1 = 0,那么2的反码 = 2 ^ (32个1)= '0b(30个1)01’
二,补码
规则:对于正数,补码就是自己。对于负数a,补码=反码(-a) +1=(-a)^ (32个1)+ 1
三,0xffffffff
其实0xffffffff = (32个1),那么简单了。
对于a的反码 = a ^ 0xffffffff,
对于a的补码 = a & 0xffffffff。
对于大多数题目来说,负数都使用负数的补码表示,那么一开始就直接使用 a & 0xffffffff。
看一下证明,补码=反码(-a) +1=(-a)^ (32个1)+ 1 = a & 0xffffffff。
>>> a = -2
>>> bin(a)
'-0b10'
>>> bin(a&0xffffffff)
'0b11111111111111111111111111111110'
>>> bin(-a^0xffffff + 1)
'0b1000000000000000000000010'
如果题目中给负数的补码c表示,我们怎么把它恢复成负数呢?
按照第二部分的规则,我们倒着来,负数 =- 反码(int(c,2)-1)
>>> c
'0b11111111111111111111111111111110'
>>> -((int(c,2)-1)^0xffffffff)
-2