【问题标题】:Javascript Decimal to Binary - 64 bitJavascript 十进制到二进制 - 64 位
【发布时间】:2012-06-11 18:57:48
【问题描述】:

十进制-805306368的二进制是:

1111111111111111111111111111111 11010000000000000000000000000000

但是,在 Javascript 中我得到 following:

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

-1100000000000000000000000000000

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

【问题讨论】:

  • 您的问题中有一点语义上的有趣问题。 -805306368 in base 10 正是你得到的:-110000000000000000000000000000 in base 2。你正在寻找的是二进制补码表示。
  • 感谢您的澄清。

标签: javascript binary decimal


【解决方案1】:

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");
}

【讨论】:

  • 是的,这正是我所追求的。谢谢。
  • 我刚刚意识到这一点。我期望返回的是“11010000000000000000000000000000”(前 32 位)
  • 好的,关于实现我自己的格式化算法的任何指针 - 或者我可以使用另一种语言的示例作为指导?
  • 完美,你的功能很好用。非常感谢您的帮助,如果嘉士伯有答案.. :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2017-05-22
    • 2018-08-26
    • 2017-08-08
    相关资源
    最近更新 更多