5

我正在尝试在 Python 中复制一个简单的按位 Javascript 操作。

[Javascript]

> 0xA867Df55
  2825379669
> 0xA867Df55 ^ 0
  -1469587627

[Python]

>>> 0xA867DF55
2825379669L
>>> 0xA867DF55 ^ 0
2825379669L

阅读以下内容:

ruby vs javascript中的按位或

听起来这里的问题是 Javascript 中的 0xA867Df55 (2825379669) 大于最大的有符号 32 位 int (2147483647),这导致了意外的 Javascript 结果。

然后邮件继续建议:

“如果出于某种原因你想在 Ruby 中重现它,你可以将你的数字与 1FFFFFFFF 相加,这样你就只在最低有效的 32 位上进行操作,然后将它与 0 相或(除了会给你相同的结果之外什么都不做) 。”

但如果我试试这个:

>>> (0xA867DF55 & 0x1FFFFFFF) ^ 0
141025109L

我只需要在 Python 中复制 Javascript 行为。任何人都可以建议适当的按位运算吗?

谢谢。

4

1 回答 1

4

How about converting from uint32 to int32.

import struct
print struct.unpack('i', struct.pack('I', 0xA867Df55))[0]

OUTPUT

-1469587627

Or as @Ashwini suggests:

import ctypes
print ctypes.c_int(0xA867DF55 ^ 0).value

OUTPUT

-1469587627
于 2013-06-14T07:04:25.830 回答