JavaScript位运算符代码和Python位运算符代码的区别

7

我已经将使用位运算符的JavaScript代码转换为Python代码,但是在JavaScript和Python中执行时存在一个问题。

412287 << 10

当我在两种语言中执行此操作时,会得到相同的结果422181888。但是当我在两种语言中都这样做时,我得到了以下结果。

424970184 << 10

在JavaScript和Python中,我得到了不同的结果,分别是1377771520435169468416

有人能帮我解决这个问题吗? 非常感谢您的任何帮助。

2个回答

6
如果您想获取JavaScript的等价值,可以执行以下操作:
import ctypes

print(ctypes.c_int(424970184 << 10 ^ 0).value)

输出:

1377771520

嗨@Achilles,谢谢你的回答,我已经尝试过了,它可以工作,那么对于>>运算符也有效吗? - VASIM SETA
是的,这将得到与Javascript相同的溢出行为。 - Taufiq Rahman
谢谢@Achilles,最后一个问题,它适用于所有位运算符吗?例如^运算符? - VASIM SETA
是的,它应该可以正常工作,因为它只是限制了 Python 无限整数精度。 - Taufiq Rahman
1
谢谢 @Achilles 的所有回复,它们对我非常有帮助。 - VASIM SETA

4

此SO答案所述,Javascript中的位运算符和移位运算符作用于32位整数,您的第二个示例超出了32位容量,因此Python等效代码为:

(424970184 << 10) & 0x7FFFFFFF

使用有符号32位整数掩码可获得“模数”/“掩码”值,而不是实际值。

在Python中,整数容量没有限制,因此您将获得实际值。


据我所知,JavaScript使用54位来表示数字。 - Willem Van Onsem
但是 (424970184 << 10) & (2**53-1) 的结果为 435169468416 - Jean-François Fabre
2
啊,但是按位运算符作用于32位。但一个int本身的存储空间有54位。 - Willem Van Onsem
1
刚刚自己检查了一下。感谢您指出这一点,如果没有这些信息,我的答案将是不正确的。 - Jean-François Fabre
1
@WillemVanOnsem:JavaScript中的数字实际上是双精度(8字节)浮点数,而不是整数。双精度可以精确表示高达2^53的整数,就像54位整数一样,但它们并不是整数。 - RemcoGerlich
感谢 @Jean-François Fabre 的快速回复! - VASIM SETA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接