5

十进制 -805306368 的二进制是:

11111111111111111111111111111111 11010000000000000000000000000000

但是,在 Javascript 中,我得到以下信息:

   var str = parseInt(-805306368).toString(2);
   document.write(str);

-1100000000000000000000000000000

谁能解释如何从这个十进制解析 64 位二进制字符串?

4

2 回答 2

13

JavaScript 不使用二进制补码表示,它-在字符串前面使用一个字符。那是因为它不知道您的数字范围有多少位。

要获得预期的结果,您可以反转每一位:

>>> (~-805306368).toString(2)
"101111111111111111111111111111"

然而,javascript 对 32 位整数执行所有二进制操作,因此这不适用于更大(或更小)的数字,至少会非常混乱。因此,您需要实现自己的格式化算法。

// example of to 32-bit-conversion:
>>> (~parseInt("1111111111111111111111111111111",2)).toString(2)
"-10000000000000000000000000000000"
>>> (~parseInt("11111111111111111111111111111111",2)).toString(2)
"0"

我的实现:

String.prototype.padleft = function(len, chr){...}

function get64binary(int) {
    if (int>=0)
        return int
          .toString(2)
          .padleft(64, "0");
    // else
    return (-int-1)
      .toString(2)
      .replace(/[01]/g, function(d){return +!+d;}) // hehe: inverts each char
      .padleft(64, "1");
}
于 2012-06-07T17:29:37.323 回答
2

你可以parseInt()再次使用。它有一个可选的第二个参数,使您能够指定要解析的字符串中数字的基数(或基数)。

如:parseInt("-110000000000000000000000000000", 2) // gives -805306368

于 2012-06-07T17:17:34.750 回答