【问题标题】:Python / Javascript -- integer bitwise exclusive or problemPython / Javascript - 整数按位异或问题
【发布时间】:2010-12-21 21:06:00
【问题描述】:

我精通这两种语言...但是整数位异或逻辑运算符有问题。在 javascript 中,它给了我一个结果,在 python 中,它给了我另一个..

继续,打开 python 并执行 (-5270299) ^ 2825379669

现在使用 javascript,进行相同的计算,并提醒结果或其他任何内容(例如 http://thorat.org/OS/js.php

结果不一样!我不知道为什么!

我一定错过了什么。

【问题讨论】:

    标签: javascript python integer bit-manipulation xor


    【解决方案1】:

    JavaScript 的整数是 32 位的,而当值超过 32 位时,Python 会自动转换为无限长度 long 格式。如果您明确强制 Python 不签名超过 32 位,或者如果您将结果截断为 32 位,那么结果是相同的:

    >>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
    1472744368L
    >>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
    1472744368L
    

    【讨论】:

      【解决方案2】:

      2825379669 适合 32 位。

      JavaScript 中的所有数字都是 64 位浮点数,但是在对它们进行按位运算时,它们会先转换为 32 位整数,然后执行按位运算,然后再转换回 64 位浮点数。

      另一方面,Python 很乐意处理整数的 long 值(超过 32 位)。

      因此,如果您希望在 JavaScript 中获得相同的结果,则必须采取一些技巧,例如将 64 位整数存储在两个 JavaScript 数字中,然后对这两个数字执行操作。这将比 float 到 int 和返回的内置转换中已经可怕的慢速还要慢。

      【讨论】:

        【解决方案3】:

        不,他们不是。 Python 仅保留符号,因为它可以处理更大的整数。

        js> ((-5270299) ^ 2825379669).toString(16)
        57c84bb0
        
        >>> hex((-5270299 ^ 2825379669))
        '-0xa837b450'
        >>> hex((-5270299 ^ 2825379669)+2**32)
        '0x57c84bb0'
        

        【讨论】:

          猜你喜欢
          • 2015-06-08
          • 2016-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-03
          • 2018-09-26
          • 2012-09-23
          • 1970-01-01
          相关资源
          最近更新 更多