Python中二进制1的补码(按位取反)操作结果与预期不符求助
为什么Python中
~运算符和C语言效果不同 Python的整数采用变长有符号补码存储逻辑,和C语言固定位数的整数规则有差异。~作为按位非运算符,在Python中会对整数的所有位(包括符号位)取反,运算规则等价于-x - 1,因此对0b1010(十进制10)执行~a会得到-11,而非你预期的低4位取反结果。
逐位翻转二进制位的实现方法
你只需要将取反结果和对应位数的全1掩码做按位与操作,屏蔽高位符号位的影响即可:
- 已知二进制位数的场景
以你示例中的4位二进制数为例,全1掩码为0b1111(十进制15):
a = 0b1010 res = ~a & 0b1111 print(res) # 输出5,对应二进制0b101
如果是固定位数的通用场景,可以直接用对应长度的掩码:
8位二进制:使用掩码
0xFF16位二进制:使用掩码
0xFFFF32位二进制:使用掩码
0xFFFFFFFF不确定二进制位数的场景
可以通过bit_length()方法动态获取当前数字的二进制有效位数,自动生成对应掩码:
a = 0b1010 mask = (1 << a.bit_length()) - 1 res = ~a & mask print(bin(res)) # 输出0b101
内容的提问来源于stack exchange,提问作者Noám Manriquez
相关产品推荐
相关产品推荐

