Gibt es "0b" oder ähnliches, um eine Binärzahl in Javascript darzustellen?

130

Ich weiß, dass dies 0xein Präfix für Hexadezimalzahlen in Javascript ist. Zum Beispiel 0xFFsteht für die Nummer 255.

Gibt es etwas Ähnliches für Binärzahlen? Ich würde erwarten 0b1111, die Nummer zu repräsentieren 15, aber das funktioniert bei mir nicht.

Mischa Moroshko
quelle
1
Aus Neugier: Warum brauchen Sie binäre Literale in Javascript? Die übergeordnete Natur von Javascript bedeutet, dass es normalerweise nicht mit Konstrukten auf niedriger Ebene interagieren muss, für die binäre Literale erforderlich wären.
Joachim Sauer
19
Auf diese Weise ist der Code besser lesbar. Meine Implementierung basiert auf einer Spezifikation, die Binärzahlen verwendet.
Mischa Moroshko
5
Die Verwendung des Knotens js für die Robotik ist ein gutes Beispiel dafür, wo möglicherweise Binärdateien erforderlich sind
Greg Woods,
Sie können zur besseren Lesbarkeit numerische Trennzeichen verwenden . 0b0111_0_1_0_1.
8онстантин Ван

Antworten:

181

Aktualisieren:

Neuere Versionen von JavaScript - insbesondere ECMAScript 6 - bieten Unterstützung für binäre (Präfix 0b), oktale (Präfix 0o) und hexadezimale (Präfix 0x:) numerische Literale:

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

Diese Funktion ist bereits in Firefox und Chrome verfügbar. Es wird derzeit im IE nicht unterstützt, wird aber anscheinend sein, wenn Spartan eintrifft.

(Dank Semikolon ‚s Kommentar und Antwort des urish für diesen Hinweis.)

Ursprüngliche Antwort:

Nein, es gibt kein Äquivalent für Binärzahlen. JavaScript unterstützt nur numerische Literale in den Formaten Dezimal (kein Präfix), Hexadezimal (Präfix 0x) und Oktal (Präfix 0).

Eine mögliche Alternative besteht darin, eine binäre Zeichenfolge parseIntzusammen mit dem Radix an die Methode zu übergeben:

var foo = parseInt('1111', 2);    // foo will be set to 15
LukeH
quelle
2
@ MischaMoroshko Ich stimme zu, aber nur wenige Sprachen haben 0bUnterstützung.
Alba Mendez
5
Technisch gesehen bietet JavaScript keine Oktalschreibweise, obwohl die meisten (alle?) Browser dies unterstützen. Es ist im strengen Modus ausdrücklich nicht erlaubt.
Deebster
5
Beachten Sie, dass intern in JavaScript jede Zahl ein 64-Bit-Float ist und es keine Ganzzahl gibt. Bei großen Zahlen verlieren Sie also an Genauigkeit. Die größte genaue "Ganzzahl" ist 2 ^ 53 oder 9007199254740992.
zupa
5
Es gibt Ganzzahlen, da Ganzzahl ein mathematischer Begriff ist, gibt es kein int typeNoch integer type, daher werden alle Ganzzahlen als Gleitkommazahlen gespeichert.
Perkins
3
Diese Antwort war zu der Zeit wahr, könnte aber ein Update gebrauchen. Wie Urish in seiner Antwort unten ausführt, befinden sich Literale für Binär- und Oktalzahlen (Oktale werden jetzt mit "0o1" geschrieben) in ES6. Sie sind bereits in Firefox, Chrome und sogar in der Vorschau des neuen IE (Spartan) gelandet.
Semikolon
29

In ECMASCript 6 wird dies als Teil der Sprache unterstützt, dh es 0b1111 === 15ist wahr. Sie können auch Großbuchstaben B (z 0B1111. B. ) verwenden.

Suchen Sie NumericLiteralsin der ES6-Spezifikation .

urish
quelle
23

Ich weiß, dass die Leute sagen, dass die Erweiterung der Prototypen keine gute Idee ist, sondern Ihr Drehbuch ...

Ich mache es so:

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
Juan Garcia
quelle
3
Das ist cool! 8-) Beachten Sie, dass ParseInt("101", 2)dies die eigentliche Antwort sein könnte!
Alexis Wilke
20

Wenn Ihr Hauptanliegen eher die Anzeige als die Codierung ist, können Sie ein integriertes Konvertierungssystem verwenden:

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

Ref: JavaScript-Nummernreferenz

Pops
quelle
11

Soweit ich weiß, ist es nicht möglich, einen binären Denoter in Javascript zu verwenden. Ich habe drei Lösungen für Sie, die alle ihre Probleme haben. Ich denke, Alternative 3 sieht in Bezug auf die Lesbarkeit am besten aus und ist möglicherweise viel schneller als die anderen - abgesehen von den anfänglichen Laufzeitkosten. Das Problem ist, dass nur Werte bis zu 255 unterstützt werden.

Alternative 1: "00001111".b()

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

Alternative 2: b("00001111")

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

Alternative 3: b00001111

In dieser Version können Sie entweder 8-stellige binäre b00000000, 4-stellige b0000und variable Ziffern eingeben b0. Das ist b01illegal, muss man benutzen b0001oder 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;
frodeborli
quelle
6

Vielleicht ist dies nützlich:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15
Sergey Metlov
quelle
10
Süß, wenn auch etwas komisch. Aber das ist JavaScript für Sie. binwird eine Zahl zugewiesen, die aussieht, als wäre sie binär, wird aber tatsächlich zur Basis 10 analysiert. Die parseIntFunktion erwartet einen String als erstes Argument, wandelt ihn also in "1111" (Basis 10-Darstellung) um und analysiert ihn dann erneut, als ob es war Basis 2.
Ted Hopp
2

Nein, aber Sie können parseInt verwenden und optional die Anführungszeichen weglassen.

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

Der einzige Nachteil beim Weglassen der Anführungszeichen besteht darin, dass Sie bei sehr großen Zahlen schneller überlaufen:

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

Konvertieren Sie binäre Zeichenfolgen in Zahlen und umgekehrt.

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

Ich weiß, dass dies das gestellte Q (das bereits mehrmals beantwortet wurde) nicht so beantwortet, wie es ist. Ich schlage jedoch vor, dass Sie (oder andere an diesem Thema interessierte Personen) die Tatsache berücksichtigen, dass es am besten lesbar und rückwärts / zukünftig / browserübergreifend kompatibel ist Weg wäre, nur die Hex-Darstellung zu verwenden.

Aus der Formulierung des Q geht hervor, dass Sie nur über die Verwendung von Binärliteralen in Ihrem Code und nicht über die Verarbeitung von Binärdarstellungen numerischer Werte sprechen (für die parstInt der richtige Weg ist).

Ich bezweifle, dass es viele Programmierer gibt, die mit Binärzahlen umgehen müssen, die mit der Zuordnung von 0-F zu 0000-1111 nicht vertraut sind. Bilden Sie also im Grunde Vierergruppen und verwenden Sie die Hex-Notation.

Anstatt 101000000010 zu schreiben, würden Sie 0xA02 verwenden, das genau die gleiche Bedeutung hat, weitaus besser lesbar ist und weniger fehleranfällig ist.


Denken Sie nur an die Lesbarkeit. Vergleichen Sie, welche davon größer ist: 10001000000010010 oder 1001000000010010

und was ist, wenn ich sie so schreibe:
0x11012 oder 0x9012

Epeleg
quelle
-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; }
}
Stellen Sie sich Breaker vor
quelle
parseInt (ohne zweiten Parameter) konvertiert die Binärzeichenfolge zurück in eine Basis-10-Zahl! zB 0b100 (4) wird 100 und wird dann durch Alarm zu einem String zurückgesetzt!
Tom