为何在Python中用(2**32-1)与二进制数进行XOR会翻转所有位?
为什么(2**32 - 1)和异或(^)能翻转二进制位?
1. 异或(XOR)的核心规则
异或运算的位操作逻辑很直接:两个对应位相同得0,不同得1,单个位的运算细节:
1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0
简单说,任何位和1做异或,结果就是原位的翻转;和0做异或,结果保持原位不变。
2. (2**32 - 1)的二进制形式
计算2 ** 32得到4294967296,它的二进制是1后面跟32个0。减去1之后,二进制就变成了32个连续的1:
11111111111111111111111111111111
这个数是32位无符号整数的最大值。
3. 两者结合实现位翻转
当你把一个32位二进制数和2**32 - 1做异或时,相当于每一位都和1进行运算:
- 原数的
1位 →1 ^ 1 = 0(翻转成0) - 原数的
0位 →0 ^ 1 = 1(翻转成1)
你的示例验证
你给出的示例中,原数是32位的00000000000000000000000000000001(对应整数1),和2**32 - 1异或的正确代码应该是:
print(0b00000000000000000000000000000001 ^ (2 ** 32 - 1))
输出的整数是4294967294,它的32位二进制形式就是11111111111111111111111111111110,完全符合每一位翻转的结果。
注意:Python中直接写
00000000000000000000000000000001会报错(Python3不支持无前缀的八进制数),正确的二进制写法要加0b前缀,或者直接用整数1,Python会自动处理位运算逻辑。
内容的提问来源于stack exchange,提问作者rambo
相关产品推荐
相关产品推荐

