JavaScript与Python位运算结果不一致问题求助
JavaScript与Python位运算结果不一致问题求助
嘿,我最近碰到一个搞不懂的问题:同样逻辑的位运算代码,JavaScript跑出来的结果是5322244621,但Python代码得到的却是22502113805,我本来以为两者应该返回相同结果的,有没有大佬能帮忙看看哪里出问题了?
我的代码如下:
Python代码:
x = (144366253 << 7 | 144366253 >> 32 - 7) + 4023233417
JavaScript代码:
var x = (144366253 << 7) | (144366253 >> (32 - 7)) + 4023233417;
问题根源分析
我查了一下,主要是两个原因导致结果不一样:
运算符优先级差异
- 在JavaScript里,
+的优先级比按位或|更高,所以你的JS代码实际执行顺序是:var x = (144366253 << 7) | [(144366253 >> 25) + 4023233417]; - 但在Python中,算术运算符(
+、-)的优先级高于位运算符(<<、>>、|),而且位运算符内部<<、>>优先级高于|,所以Python代码的执行顺序是:x = [(144366253 << 7) | (144366253 >> 25)] + 4023233417
这就导致了两者的计算逻辑本质上不一样。
- 在JavaScript里,
整数类型的差异
- JavaScript的位运算会自动把数字转换为32位有符号整数,超过32位的部分会被截断;
- 而Python的整数是任意精度的,不会自动截断,所以计算出来的数值会比JS大很多。
解决方法
要让Python代码得到和JS一样的结果,需要同时修正优先级和模拟32位整数截断:
# 先计算移位后的加法,再进行按位或,最后模拟32位截断 shifted = 144366253 << 7 add_part = (144366253 >> 25) + 4023233417 # 模拟JS的32位有符号整数截断:先取模2^32,再处理负数 x = (shifted | add_part) % (2 ** 32) # 如果结果大于2^31-1,转为有符号整数 if x > 2**31 - 1: x -= 2**32 print(x) # 输出:5322244621
这样修改后,Python代码的结果就和JavaScript一致啦!
备注:内容来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

