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).

31voto

barlop Punkte 11355

Eine Lösung, die ich mit gehen würde, die für 32-Bit in Ordnung ist, ist der Code am Ende dieser Antwort, die von developer.mozilla.org (MDN) ist, aber mit einigen Zeilen für A) Formatierung und B) Überprüfung, dass die Zahl im Bereich ist hinzugefügt.

Einige Vorschläge x.toString(2) was bei Negativen nicht funktioniert, da wird einfach ein Minuszeichen eingefügt, was nicht gut ist.

Fernando erwähnte eine einfache Lösung von (x>>>0).toString(2); was für Negative gut ist, aber ein kleines Problem hat, wenn x positiv ist. Die Ausgabe beginnt mit 1, was für positive Zahlen nicht das richtige 2er-Komplement ist.

Wer nicht versteht, dass positive Zahlen mit 0 und negative Zahlen mit 1 im 2er-Komplement beginnen, kann dies in SO QnA über das 2er-Komplement überprüfen. Was ist das "2er-Komplement"?

Eine Lösung könnte darin bestehen, bei positiven Zahlen eine 0 voranzustellen, was ich in einer früheren Überarbeitung dieser Antwort getan habe. Und man könnte akzeptieren, dass man manchmal eine 33-Bit-Zahl hat, oder man könnte dafür sorgen, dass die zu konvertierende Zahl im Bereich -(2^31)<=x<2^31-1 liegt. Die Zahl ist also immer 32bit. Aber anstatt das zu tun, kann man auch diese Lösung auf mozilla.org verwenden

Patricks Antwort und Code ist lang und funktioniert anscheinend für 64-Bit, hatte aber einen Fehler, den ein Kommentator gefunden hat, und der Kommentator hat Patricks Fehler behoben, aber Patrick hat irgendeine "magische Zahl" in seinem Code, die er nicht kommentiert hat und die er vergessen hat, und Patrick versteht seinen eigenen Code nicht mehr vollständig / warum er funktioniert.

Annan hatte einige unkorrekte und unklare Terminologie, erwähnte aber eine Lösung von developer.mozilla.org

Hinweis - der alte Link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators leitet jetzt woanders hin und hat diesen Inhalt nicht mehr, aber der richtige alte Link, der erscheint, wenn archive.org Seiten abruft, ist hier verfügbar https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

Die Lösung dort funktioniert für 32-Bit-Zahlen.

Der Code ist ziemlich kompakt, eine Funktion von drei Zeilen.

Ich habe jedoch eine Regex hinzugefügt, um die Ausgabe in Gruppen von 8 Bits zu formatieren. Basierend auf Wie formatiert man eine Zahl mit Kommas als Tausendertrennzeichen? (Ich habe es gerade von der Gruppierung in 3s von rechts nach links und Hinzufügen Kommas zur Gruppierung in 8s von rechts nach links, und das Hinzufügen Räume )

Und, während Mozilla einen Kommentar über die Größe von nMask (die Zahl eingegeben) dass es im Bereich sein muss, sie nicht testen für oder werfen einen Fehler, wenn die Zahl außerhalb des Bereichs ist, so habe ich hinzugefügt, dass.

Ich bin mir nicht sicher, warum sie ihren Parameter 'nMask' genannt haben, aber ich werde das so lassen.

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"

//added further console.log example
console.log(createBinaryString(2**31 -1)) //"01111111 11111111 11111111 11111111"

0 Stimmen

nMask Name könnte daran liegen, dass die Ganzzahl als ein Bitmaske und nMask bezieht sich dann auf mehrere Masken (ein Satz von einer oder mehreren Masken, die zu einer einzigen zusammengefügt sind). Siehe Abschnitt "Automatisierte Maskenerstellung": developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/

10voto

supritshah1289 Punkte 831

Sie können Ihre eigene Funktion schreiben, die ein Array von Bits zurückgibt. Beispiel für die Umwandlung von Zahlen in Bits

Divisor| Dividend| Bits/Rest

2 | 9 | 1

2 | 4 | 0

2 | 2 | 0

~ | 1 |~

Beispiel für die obige Zeile: 2 * 4 = 8 und der Rest ist 1 also 9 = 1 0 0 1

function numToBit(num){
    var number = num
    var result = []
    while(number >= 1 ){
        result.unshift(Math.floor(number%2))
        number = number/2
    }
    return result
}

Lesen Sie die Reste von unten nach oben. Stelle 1 in der Mitte nach oben.

1 Stimmen

Übrigens, warum haben Sie Math.floor(number%2) anstelle von number = Math.floor(number/2) ?

2 Stimmen

Der Grund dafür ist, dass number%2 nicht gleich number/2 ist. Wir sind interessiert an Restbetrag nicht Quotient.

5voto

gildniy Punkte 2458

Das ist meine Art, damit umzugehen:

const decbin = nbr => {
  if(nbr < 0){
     nbr = 0xFFFFFFFF + nbr + 1
  }
  return parseInt(nbr, 10).toString(2)
};

Ich habe es von diesem Link: https://locutus.io/php/math/decbin/

0 Stimmen

@barlop danke für den Hinweis, er ist jetzt bearbeitet

1 Stimmen

Können Sie die Logik hinter diesem Code erklären, wie es funktioniert.. dass durch das Hinzufügen von 0xFFFFFFFF+1 zu negativen Zahlen dann es funktioniert... und wenn Sie den Code von irgendwo bekommen haben, können Sie auf eine Quelle verlinken? Danke

0 Stimmen

@barlop, habe es von diesem Link: locutus.io/php/math/decbin

2voto

Yadab Sd Punkte 527

Eine aktuelle Lösung, deren Logik mit jeder Programmiersprache implementiert werden kann:

Wenn Sie sicher sind, dass es nur positiv ist:

var a = 0;
var n = 12; // your input
var m = 1;
while(n) {
    a = a + n%2*m;
    n = Math.floor(n/2);
    m = m*10;
}

console.log(n, ':', a) // 12 : 1100

Kann negativ oder positiv sein -

(n >>> 0).toString(2)

0 Stimmen

Sie haben nicht einmal die erste Zeile der Frage gelesen, in der es hieß, dass auch negative Zahlen berücksichtigt werden. Deine Lösung funktioniert nicht für negative Zahlen.

0 Stimmen

@barlop du solltest das Ideale respektieren, nicht das, was du suchst. Js ist eine lockere Sprache, die Sie wissen. Sie können es leicht tun, indem (n >>> 0).toString(2)

1 Stimmen

Versuchen Sie, andere Antworten zu lesen, anstatt eine Antwort zu posten, die die Frage nicht beantwortet (sie geht nicht auf negative Zahlen ein), und passen Sie dann Ihre Antwort mit einer Kopie einer Lösung an, die in einer anderen Antwort erwähnt wird, um es für negative Zahlen zu tun. Übrigens, MDN hat auch eine Lösung, aber all das wird in anderen Antworten erwähnt, also fügst du hier nichts hinzu.

2voto

Lars Flieger Punkte 1349

Sie könnten eine rekursive Lösung verwenden:

function intToBinary(number, res = "") {
  if (number < 1)
    if (res === "") return "0"
      else 
     return res
  else return intToBinary(Math.floor(number / 2), number % 2 + res)
}
console.log(intToBinary(12))
console.log(intToBinary(546))
console.log(intToBinary(0))
console.log(intToBinary(125))

Funktioniert nur mit positiven Zahlen.

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