5

10 進数 -805306368 のバイナリは次のとおりです。

1111111111111111111111111111111 110100000000000000000000000000

ただし、Javascript ではのようになります。

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

-11000000000000000000000000000

この10進数から64ビットのバイナリ文字列を解析する方法を誰か説明できますか?

4

2 に答える 2

13

JavaScriptは、2の補数表現を使用せず-、文字列の前に文字を使用します。これは、数値範囲のビット数がわからないためです。

期待される結果を得るには、各ビットを反転します。

>>> (~-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()。オプションの 2 番目のパラメーターがあり、解析しようとしている文字列の数値の基数 (基数) を指定できます。

そのような:parseInt("-110000000000000000000000000000", 2) // gives -805306368

于 2012-06-07T17:17:34.750 に答える