JavaScriptで2進数を表す「0b」またはそれに類似したものはありますか


130

私はそれ0xがJavascriptの16進数のプレフィックスであることを知っています。たとえば、0xFF255を表します。

2進数に似たものはありますか?0b1111数を表すことを期待します15が、これは私にはうまくいきません。


1
好奇心から:JavaScriptでバイナリリテラルが必要なのはなぜですか?JavaScriptの高レベルの性質は、通常、バイナリリテラルを必要とする低レベルの構成要素とやり取りする必要がないことを意味します。
Joachim Sauer、

19
これにより、コードが読みやすくなります。私の実装は、2進数を使用するいくつかの仕様に基づいています。
Misha Moroshko

5
ロボット工学にノードjsを使用することは、バイナリが必要になる可能性のある良い例です
Greg Woods

読みやすくするために、数値セパレータを使用することを検討してください。0b0111_0_1_0_1
КонстантинВан

回答:


181

更新:

JavaScriptの新しいバージョン(特にECMAScript 6 0b)では、2進数(prefix )、8進数(prefix 0o)、16進数(prefix 0x:)の数値リテラルのサポートが追加されています。

var bin = 0b1111;    // bin will be set to 15
var oct = 0o17;      // oct will be set to 15
var oxx = 017;       // oxx will be set to 15
var hex = 0xF;       // hex will be set to 15
// note: bB oO xX are all valid

この機能は、FirefoxとChromeですでに利用可能です。現在IEではサポートされていませんが、Spartanが到着したときにサポートされる予定です。

(おかげセミコロンのコメントとurishの答え、このうちを指し示します。)

元の回答:

いいえ、2進数に相当するものはありません。JavaScriptは、10進数(接頭辞なし)、16進数(接頭辞0x)および8進数(接頭辞0)形式の数値リテラルのみをサポートしています。

可能な代替策の1つは、バイナリ文字列をparseInt基数とともにメソッドに渡すことです。

var foo = parseInt('1111', 2);    // foo will be set to 15

2
@MishaMoroshko同意しますが、0bサポートされている言語はほとんどありません。
アルバメンデス

5
技術的には、JavaScriptは8進数表記を備えていませんが、ほとんどの(すべての?)ブラウザーは8進数表記をサポートしています。strictモードでは明示的に禁止されています。
Deebster 2013年

5
JavaScriptの内部では、すべての数値は64​​ビットの浮動小数点数であり、整数などはありません。したがって、膨大な数の場合、精度が低下します。最大の正確な「整数」2 ^ 53、または9007199254740992.ある
zupa

5
整数があります。整数は数学の用語なので、int typenor はありませんinteger type。したがって、すべての整数は浮動小数点数として格納されます。
Perkins

3
この答えは当時は真実でしたが、更新を使用することもできました。urishが以下の彼の回答で指摘しているように、2進数と8進数のリテラル(8進数は「0o1」と書かれています)はES6にあります。彼らはすでにFirefox、Chrome、そして新しいIE(Spartan)のプレビューにも上陸しています。
セミコロン2015

29

ECMASCript 6では、これ0b1111 === 15は言語の一部としてサポートされます。つまり、真です。大文字のBを使用することもできます(例:)0B1111

ES6仕様NumericLiteralsで探します。


23

プロトタイプを拡張するのは良い考えではないと人々が言っ​​ていることは知っていますが、それはあなたの脚本でした...

私はこのようにします:

Object.defineProperty(Number.prototype, 'b', {set:function(){return false;},get:function(){return parseInt(this, 2);}});

100..b       // returns 4
11111111..b  // returns 511
10..b+1      // returns 3

// and so on

3
これはカッコいい!8-)ParseInt("101", 2)実際の答えになる可能性があることに注意してください!
Alexis Wilke、2014年

20

コーディングではなく表示が主な関心事である場合は、組み込みの変換システムを使用できます。

var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"

参照:JavaScript番号リファレンス


11

私の知る限り、Javascriptでバイナリの分母を使用することはできません。私には3つの解決策がありますが、すべて問題があります。選択肢3は読みやすさの点で最も「見栄えがいい」と思います。初期の実行時間のコストを除いて、他の3は他のものよりもはるかに高速です。問題は、255までの値のみをサポートすることです。

代替1: "00001111".b()

String.prototype.b = function() { return parseInt(this,2); }

代替2: b("00001111")

function b(i) { if(typeof i=='string') return parseInt(i,2); throw "Expects string"; }

代替3: b00001111

このバージョンでは、8桁の2進数b00000000、4桁b0000、可変桁のいずれかを入力できますb0。これはb01違法です。b0001またはを使用する必要がありb1ます。

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}
for(var i = 0; i < 256; i++)
    window['b' + i.toString(2)] = window['b' + i.toString(2).lpad('0', 8)] = window['b' + i.toString(2).lpad('0', 4)] = i;

6

これは役に立つかもしれません:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15

10
かわいい、少し変なのなら。しかし、それはあなたのためのJavaScriptです。binバイナリのように見える番号が割り当てられていますが、実際には10を基数として解析されています。parseInt関数は最初の引数として文字列を想定しているため、「1111」(10を基数とする表現)に変換し、次のように再解析します。それはベース2だった
テッドホップ

2

いいえ。ただし、parseIntを使用して、必要に応じて引用符を省略できます。

parseInt(110, 2); // this is 6 
parseInt("110", 2); // this is also 6

引用符を省略した場合の唯一の欠点は、非常に大きな数の場合、オーバーフローが速くなることです。

parseInt(10000000000000000000000, 2); // this gives 1
parseInt("10000000000000000000000", 2); // this gives 4194304

1

バイナリ文字列を数値に変換し、その逆も可能です。

var b = function(n) {
    if(typeof n === 'string')
        return parseInt(n, 2);
    else if (typeof n === 'number')
        return n.toString(2);
    throw "unknown input";
};

-1

これは実際には質問Q(すでに何度か回答されています)に実際に回答していないことはわかっていますが、あなた(またはこの主題に関心のある他の人)が最も読みやすく、後方/将来/クロスブラウザー互換であるという事実を考慮することをお勧めします方法は、16進数表現を使用することです。

Qの言い回しから、コードでバイナリリテラルを使用することについてのみ話しているように見え、数値のバイナリ表現の処理については話していないと思われます(parstIntを使用する方法です)。

0-Fから0000-1111へのマッピングに精通していない2進数を処理する必要のあるプログラマーはたくさんいると思います。したがって、基本的には4つのグループを作成し、16進表記を使用します。

したがって、101000000010と書く代わりに、まったく同じ意味で0xA02を使用します。これは、はるかに読みやすく、エラーが発生する可能性が低くなります。

読みやすさを考慮して、どちらが大きい
かを比較してみてください:10001000000010010または1001000000010010

そして、私が次のようにそれらを書くとどうなるでしょう:
0x11012または0x9012


-3
// Conversion function
function bin(nb)
{
    return parseInt(nb.toString(2));
}

// Test
var stop = false;
while(!stop)
{
    var n = parseInt(prompt("Type a decimal number : "));
    alert(bin(n));

    var str = prompt("Retry ? Y / N");
    if(str === "N") { stop = true; }
}

parseInt(2番目のパラメーターなし)は、バイナリ文字列を10進数に変換します。たとえば、0b100(4)は100になり、アラートによって文字列に戻ります。
Tom
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.