两个补充相同的代码python / JavaScript不同的结果

时间:2014-08-05 16:45:12

标签: javascript python node.js

在python 2.7中,以下代码返回正确的结果( -18027917

from __future__ import print_function

def twos_comp(val, bits):
    if (val & (1 << (bits - 1))) != 0:
        val -= 1 << bits
     return val

valBinary = "110111011001110101001110011"
print(twos_comp(int(valBinary, 2), len(valBinary)))

在JavaScript(Node.js)中,以下代码返回不正确的结果( 1995238003

function toTwosComplement(val, bits) {
    if ((val & (1 << (bits - 1))) != 0) {
        val -= (val - 1) << bits;
    }
    return val;
}

valBinary = "110111011001110101001110011";  // same as python example
console.log(toTwosComplement(parseInt(valBinary, 2), valBinary.length));

显然,位运算符(或int / parseInt)的行为有所不同,但我无法看到它是什么。

2 个答案:

答案 0 :(得分:6)

首先,

val -= (val - 1) << bits;

val -= 1 << bits

不等同。

由于您的二进制字符串长度为27位,因此很可能是您问题的根源。


更一般地说,这两种语言对术语编号的定义有很大不同。

Python有arbitrary precision integers

  

长整数具有无限的精度。

相比之下,JavaScript有IEEE 64b doubles pretending to be integers和按位运算符truncate their operands to 32 bits

  

Number是64位浮点,类似于Java的double和Double。没有整数类型。两个整数之间的划分可能会产生一个小数结果。

这意味着您最多可以存储52 bits of precision,如果最高位大于2 ** 52,则会截断低位。


由于JavaScript的浮点特性,大二进制数的最低有效位可能会四舍五入,最高有效位可能被(<<)抛出。

答案 1 :(得分:1)

为什么这些行不匹配?

的Python:

    val -= 1 << bits

JS:

    val -= (val - 1) << bits;