1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptで整数を2進数に変換する方法は?

2022-04-13 04:01:10

質問

正負の整数を2進数で表示したい。

むしろ この質問 ただし、JavaScriptの場合。

どのように解決するのですか?

これは developer.mozilla.org(MDN) にあるものですが、A)フォーマットとB)数値が範囲内であることをチェックするためにいくつかの行を追加しています。

いくつかの提案 x.toString(2) というのは、マイナス記号がつくだけで、うまくいきません。

フェルナンドは、シンプルな解決法として (x>>>0).toString(2); これは負の値に対しては問題ないのですが、xが正の値のときにちょっとした問題があります。これは出力が1から始まるもので、正の数では適切な2S補数ではありません。

正の数が0から始まり、負の数が1から始まるという2s補数の事実を理解していない人は、このSO QnA on 2s補数をチェックしてみてください。 2の補数」とは何ですか?

解決策としては、正の数には0を前置することで、この解答の以前の改訂版で行いました。また、33ビットの数値を受け入れることもできますし、変換する数値が -(2^31)<=x<2^31-1 の範囲内であることを確認することもできます。つまり、常に32ビットの数値になるわけです。 しかし、そのようなことをするよりも、mozilla.orgにあるこの解決策を使うことができます。

Patrickの回答とコードは長く、どうやら64ビットで動作するようですが、コメントした人が見つけたバグがあり、コメントした人がpatrickのバグを修正したのですが、patrickは自分のコードにコメントしなかったし忘れてしまった魔法の数字quot"を持っていて、もはやpatrick自身のコード/なぜそれが動作するかを完全に理解できていないようです。

Annanは、いくつかの不正確で不明瞭な用語がありましたが、developer.mozilla.orgによる解決策に言及しました。

注:旧リンク https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators しかし、archive.org がページを検索したときに表示される、適切な古いリンクは、ここで利用可能です。 https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

この解決策は、32ビット数に対して有効です。

コードは3行の関数と、かなりコンパクトです。

しかし、私は8ビットのグループで出力をフォーマットするために正規表現を追加しました。ベースとなるのは JavaScriptでカンマを桁区切りにした数値を表示する方法 (でグループ化していたのを修正しただけです)。 3s を右から左へ追加し カンマ でグループ化すること。 8s を右から左へ、そして スペース )

また、モジラはnMask(入力される数値)のサイズについて、範囲内でなければならないというコメントを出していますが、範囲外の数値のテストやエラーは出していませんので、それを追加しています。

なぜパラメータに'nMask'という名前をつけたのかよくわからないが、そのままにしておくことにする。

https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

function createBinaryString(nMask) {
  // nMask must be between -2147483648 and 2147483647
  if (nMask > 2**31-1) 
     throw "number too large. number shouldn't be > 2**31-1"; //added
  if (nMask < -1*(2**31))
     throw "number too far negative, number shouldn't be < 2**31" //added
  for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 32;
       nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
  sMask=sMask.replace(/\B(?=(.{8})+(?!.))/g, " ") // added
  return sMask;
}


console.log(createBinaryString(-1))    // "11111111 11111111 11111111 11111111"
console.log(createBinaryString(1024))  // "00000000 00000000 00000100 00000000"
console.log(createBinaryString(-2))    // "11111111 11111111 11111111 11111110"
console.log(createBinaryString(-1024)) // "11111111 11111111 11111100 00000000"