Python3位移位超64位时imap函数匹配失败及运算结果不一致问题
结果不一致的原因
- 核心是两次运行的整数类型不同:
- Python IDLE中使用的是原生
int类型:Python原生整数支持任意精度,没有固定位宽限制,也不存在符号位溢出问题。1 << 63会得到正整数9223372036854775808,和1 << 0异或后就是你看到的二进制1000...0001的正数值。 - 你本地运行的代码中,参与运算的
1实际是有符号64位整数(常见为numpy.int64类型):有符号int64的最高位是符号位,执行1 << 63时会触发位宽溢出,最高位被识别为负号标记,最终得到的是负数,和1异或后就是你输出的带负号的数值,自然和table中存储的正整数无法匹配。
- Python IDLE中使用的是原生
修复方案
运算前强制将操作数转换为Python原生整数即可,修改后代码如下:
def imap(k,l): # 强制转换为原生int避免有符号位溢出 code = (int(1) << k) ^ (int(1) << l) from bisect import bisect_left idx = bisect_left(table, code) if idx != len(table) and table[idx] == code: return idx raise ValueError
内容的提问来源于stack exchange,提问作者Juhee Lee
相关产品推荐
相关产品推荐

