500 Stimmen

Wie konvertiere ich in JavaScript eine Ganzzahl in eine Binärzahl?

Ich würde gerne ganze Zahlen, positiv oder negativ, in binärer Form sehen.

Eher wie この質問 sondern für JavaScript.

3 Stimmen

Die a.toString(2)-Beispiele scheinen bei -1 nicht zu funktionieren

1 Stimmen

Es ist auch möglich, von binär nach dezimal zu konvertieren: stackoverflow.com/questions/11103487/

0 Stimmen

Und wenn ich "binär" sage, ist das vielleicht etwas zweideutig. Ich meine die interne Bitstring-Darstellung, die das 2er-Komplement ist, d.h. positive Zahlen werden zur Basis 2 und mit einer führenden 0 geschrieben (und negative Zahlen werden nicht mit einem Minuszeichen oder mit einer Vorzeichen-Darstellung geschrieben, sondern als Funktion ihres positiven Äquivalents).

796voto

fernandosavio Punkte 9070
function dec2bin(dec) {
  return (dec >>> 0).toString(2);
}

console.log(dec2bin(1)); // 1
console.log(dec2bin(-1)); // 11111111111111111111111111111111
console.log(dec2bin(256)); // 100000000
console.log(dec2bin(-256)); // 11111111111111111111111100000000

Sie können verwenden Number.toString(2) Funktion, aber sie hat einige Probleme bei der Darstellung negativer Zahlen. Zum Beispiel, (-1).toString(2) Ausgabe ist "-1" .

Um dieses Problem zu beheben, können Sie den bitweisen Operator für die vorzeichenlose Rechtsverschiebung verwenden ( >>> ), um Ihre Zahl in eine Ganzzahl ohne Vorzeichen umzuwandeln.

Wenn Sie (-1 >>> 0).toString(2) wird die Zahl um 0 Bits nach rechts verschoben, was die Zahl selbst nicht verändert, aber sie wird als Ganzzahl ohne Vorzeichen dargestellt. Der obige Code gibt Folgendes aus "11111111111111111111111111111111" richtig.

Diese Frage hat weitere Erklärungen.

-3 >>> 0 (rechte logische Verschiebung) zwingt seine Argumente in vorzeichenlose Ganzzahlen, weshalb man die 32-Bit-Zweierkomplement-Darstellung von -3 erhält.

11 Stimmen

Hier ist die Erklärung

0 Stimmen

Es ist eine Weile her, dass ich Javascript ausprobiert habe, aber ich versuche es hier w3schools.com/js/tryit.asp?filename=tryjs_output_alert mit diesem <script> window.alert((-3 >>> 0).toString(2)); </script> ja, es funktioniert

2 Stimmen

ToString(2) funktioniert nicht, weil Sie die Eingabe von Text erhalten. Verwenden Sie dies: function decToBase(dec, base){ return parseInt(dec).toString(base); } alert(decToBase(dec, 2));

306voto

Manatok Punkte 5302

Versuchen Sie

num.toString(2);

Die 2 ist das Radix und kann eine beliebige Basis zwischen 2 und 36 sein.

fuente aquí

UPDATE:

Dies funktioniert nur für positive Zahlen, Javascript stellt negative binäre Ganzzahlen in Zweierkomplementnotation dar. Ich habe diese kleine Funktion, die den Trick tun sollte, habe ich nicht getestet es aus richtig:

function dec2Bin(dec)
{
    if(dec >= 0) {
        return dec.toString(2);
    }
    else {
        /* Here you could represent the number in 2s compliment but this is not what 
           JS uses as its not sure how many bits are in your number range. There are 
           some suggestions https://stackoverflow.com/questions/10936600/javascript-decimal-to-binary-64-bit 
        */
        return (~dec).toString(2);
    }
}

Ich hatte etwas Hilfe von aquí

1 Stimmen

Funktioniert nicht für -1. a=-1; document.write(Number(a.toString(2))); zeigt -1

0 Stimmen

Die Aktualisierung scheint immer noch nicht für negative Zahlen zu funktionieren ( -3 gibt zurück. 1 ). Ich glaube auch dec > 0 sollte sein dec >= 0 was zumindest 0 ergeben sollte. Denn dec2Bin(0) gibt zurück. 10 .

0 Stimmen

Beide Fälle in den obigen Kommentaren liefern in meiner Chrome-Konsole das richtige Ergebnis - var a = -1; a.toString(2); "-1" var a = -3; a.toString(2); "-11"

89voto

ad rees Punkte 1402

Ein einfacher Weg ist einfach...

Number(42).toString(2);

// "101010"

33 Stimmen

Ich würde bevorzugen (42).toString(2)

45 Stimmen

Oder noch kürzer 42..toString(2)

10 Stimmen

Die Menschen haben damit zu kämpfen. Die Antwort ist richtig, weil sie die Eingabe (42) in eine ganze Zahl umwandelt und diese Zeile benötigt wird. Wenn Sie Ihre "Zahl" von einer Texteingabe erhalten, würde toString(2) nicht funktionieren.

60voto

AnnanFay Punkte 9283

Das Binäre in 'convert to binary' kann sich auf drei Dinge beziehen. Das Positionszahlensystem, die binäre Darstellung im Speicher oder 32-Bit-Bitstrings. (für 64bit-Bitstrings siehe Antwort von Patrick Roberts )

1. Nummernsystem

(123456).toString(2) konvertiert Zahlen zur Basis 2 Stellenwertziffernsystem . In diesem System werden negative Zahlen mit Minuszeichen geschrieben, genau wie im Dezimalsystem.

2. Interne Repräsentation

Die interne Darstellung von Zahlen ist 64-Bit-Gleitkomma und einige Einschränkungen werden in diese Antwort . Es gibt kein einfacher Weg um eine Bit-String-Darstellung in Javascript zu erstellen und auf bestimmte Bits zuzugreifen.

3. Masken und bitweise Operatoren

MDN hat eine guter Überblick wie die bitweisen Operatoren funktionieren. Das ist wichtig:

Bitweise Operatoren behandeln ihre Operanden als eine Folge von 32 Bits (Nullen und Einsen)

Bevor Operationen durchgeführt werden, werden die 64-Bit-Gleitkommazahlen in 32-Bit-Ganzzahlen mit Vorzeichen umgewandelt. Nach der Konvertierung werden sie zurückgewandelt.

Hier ist der MDN-Beispielcode für die Umwandlung von Zahlen in 32-Bit-Strings.

function createBinaryString (nMask) {
  // nMask must be between -2147483648 and 2147483647
  for (var nFlag = 0, nShifted = nMask, sMask = ""; nFlag < 32;
       nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
  return sMask;
}

createBinaryString(0) //-> "00000000000000000000000000000000"
createBinaryString(123) //-> "00000000000000000000000001111011"
createBinaryString(-1) //-> "11111111111111111111111111111111"
createBinaryString(-1123456) //-> "11111111111011101101101110000000"
createBinaryString(0x7fffffff) //-> "01111111111111111111111111111111"

1 Stimmen

Welchen Vorteil hat die Verwendung dieser Funktion gegenüber der Verwendung einer einfachen Number(num).toString(2)?

6 Stimmen

@Magus Ich denke, ich habe die Unterschiede zwischen Ziffern und binären Zeichenfolgen hinreichend erklärt. Eine 32-Bit-Binärzeichenkette ist immer zweiunddreißig Zeichen lang und besteht aus "1 "s und "0 "s. toString gibt eine aktuell Zahl, die unter Verwendung des Positionszahlensystems mit der angegebenen Basis dargestellt wird. Sie hängt ab warum Sie wollen die Zeichenfolge, sie haben sehr unterschiedliche Bedeutungen.

0 Stimmen

Entschuldigung, Sie haben Recht. Ich habe mich direkt auf den Code gestürzt.

35voto

Patrick Roberts Punkte 44324

Mit dieser Antwort wird versucht, Eingaben mit einem absoluten Wert im Bereich von 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1).


In JavaScript werden die Zahlen in 64-Bit-Gleitkommadarstellung aber bitweise Operationen zwingen sie zu 32-Bit-Ganzzahlen sur Zweierkomplementformat Jeder Ansatz, der bitweise Operationen verwendet, schränkt den Bereich der Ausgabe auf -2147483648 ein. 10 (-2 31 ) - 2147483647 10 (2 31 -1).

Wenn jedoch bitweise Operationen vermieden werden und die 64-Bit-Gleitkommadarstellung nur durch mathematische Operationen beibehalten wird, können wir zuverlässig jede sichere Ganzzahl in 64-Bit-Zweierkomplement-Binärschreibweise durch Vorzeichenerweiterung der 53-Bit twosComplement :

function toBinary (value) {
  if (!Number.isSafeInteger(value)) {
    throw new TypeError('value must be a safe integer');
  }

  const negative = value < 0;
  const twosComplement = negative ? Number.MAX_SAFE_INTEGER + value + 1 : value;
  const signExtend = negative ? '1' : '0';

  return twosComplement.toString(2).padStart(53, '0').padStart(64, signExtend);
}

function format (value) {
  console.log(value.toString().padStart(64));
  console.log(value.toString(2).padStart(64));
  console.log(toBinary(value));
}

format(8);
format(-8);
format(2**33-1);
format(-(2**33-1));
format(2**53-1);
format(-(2**53-1));
format(2**52);
format(-(2**52));
format(2**52+1);
format(-(2**52+1));

.as-console-wrapper{max-height:100%!important}

Für ältere Browser gibt es Polyfills für die folgenden Funktionen und Werte:

Als zusätzlichen Bonus können Sie jede Radix (2-36) unterstützen, wenn Sie die Zweierkomplement-Konvertierung für negative Zahlen in 64 / log durchführen 2 (Radix-)Ziffern durch Verwendung von BigInt :

function toRadix (value, radix) {
  if (!Number.isSafeInteger(value)) {
    throw new TypeError('value must be a safe integer');
  }

  const digits = Math.ceil(64 / Math.log2(radix));
  const twosComplement = value < 0
    ? BigInt(radix) ** BigInt(digits) + BigInt(value)
    : value;

  return twosComplement.toString(radix).padStart(digits, '0');
}

console.log(toRadix(0xcba9876543210, 2));
console.log(toRadix(-0xcba9876543210, 2));
console.log(toRadix(0xcba9876543210, 16));
console.log(toRadix(-0xcba9876543210, 16));
console.log(toRadix(0x1032547698bac, 2));
console.log(toRadix(-0x1032547698bac, 2));
console.log(toRadix(0x1032547698bac, 16));
console.log(toRadix(-0x1032547698bac, 16));

.as-console-wrapper{max-height:100%!important}

Wenn Sie an meiner alten Antwort interessiert sind, die ein ArrayBuffer um eine Vereinigung zwischen einer Float64Array und eine Uint16Array finden Sie in dieser Antwort Revisionsgeschichte .

0 Stimmen

Danke, es ist gut, dass dies für 64bit. funktioniert. Können Sie mir irgendwelche Vorteile dieser Antwort gegenüber der Antwort von Annan mitteilen?

3 Stimmen

Viel größere Reichweite? Es funktioniert für -(2**53)-1 a 2**53-1 statt nur -(2**31) a 2**31-1 wie die Antwort von Annan.

0 Stimmen

Ja, das ist ein großer Vorteil, ich verstehe, dass, und das wird tun, obwohl es ziemlich viel mehr Code ist, aber was ich meinte, war, ich bin neugierig, wenn irgendwelche anderen Vorteile?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X