Ich würde gerne positive oder negative Ganzzahlen in Binärform sehen.
Eher wie diese Frage , aber für JavaScript.
javascript
numbers
Barlop
quelle
quelle
Antworten:
Sie können die
Number.toString(2)
Funktion verwenden, sie hat jedoch einige Probleme bei der Darstellung negativer Zahlen. Zum Beispiel ist die(-1).toString(2)
Ausgabe"-1"
.Um dieses Problem zu beheben, können Sie den vorzeichenlosen bitweisen Operator (
>>>
) für die Rechtsverschiebung ( ) verwenden, um Ihre Zahl in eine vorzeichenlose Ganzzahl zu zwingen.Wenn Sie ausführen
(-1 >>> 0).toString(2)
, verschieben Sie Ihre Zahl 0-Bits nach rechts, wodurch die Zahl selbst nicht geändert wird, sondern als vorzeichenlose Ganzzahl dargestellt wird. Der obige Code wird"11111111111111111111111111111111"
korrekt ausgegeben .Diese Frage hat weitere Erklärungen.
quelle
Versuchen
Die 2 ist der Radix und kann eine beliebige Basis zwischen 2 und 36 sein
Quelle hier
AKTUALISIEREN:
Dies funktioniert nur für positive Zahlen. Javascript repräsentiert negative binäre Ganzzahlen in Zweierkomplementnotation. Ich habe diese kleine Funktion gemacht, die den Trick machen sollte, ich habe sie nicht richtig getestet:
Ich hatte Hilfe von hier
quelle
-3
Retouren1
) zu funktionieren . Auch ich glaubedec > 0
sollte seindec >= 0
, was mindestens 0 beheben sollte. Weildec2Bin(0)
zurück10
.Die Binärdatei in 'In Binär konvertieren' kann sich auf drei Hauptsachen beziehen. Das Positionsnummernsystem, die binäre Darstellung im Speicher oder 32-Bit-Bitstrings. (Für 64-Bit-Bitstrings siehe Patrick Roberts 'Antwort )
1. Zahlensystem
(123456).toString(2)
konvertiert Zahlen in das Positionszahlensystem der Basis 2 . In diesem System werden negative Zahlen wie in Dezimalzahlen mit Minuszeichen geschrieben.2. Interne Vertretung
Die interne Darstellung von Zahlen ist ein 64-Bit-Gleitkomma In dieser Antwort werden einige Einschränkungen erläutert . Es gibt keine einfache Möglichkeit , eine Bit-String-Darstellung davon in Javascript zu erstellen oder auf bestimmte Bits zuzugreifen.
3. Masken und bitweise Operatoren
MDN hat eine guten Überblick über die Funktionsweise bitweiser Operatoren. Wichtig:
Bevor Operationen angewendet werden, werden die 64-Bit-Gleitkommazahlen in 32-Bit-Ganzzahlen mit Vorzeichen umgewandelt. Nachdem sie zurück konvertiert wurden.
Hier ist der MDN-Beispielcode zum Konvertieren von Zahlen in 32-Bit-Zeichenfolgen.
quelle
Ein einfacher Weg ist nur ...
quelle
(42).toString(2)
42..toString(2)
1.
was gleich1.0
oder nur ist1
(und in ähnlicher Weise können Sie auch den vorherigen Teil weglassen und.5
stattdessen schreiben0.5
). Im Beispiel ist der erste Punkt das Dezimaltrennzeichen, das Teil der Zahl ist, und der zweite Punkt ist der Punktoperator zum Aufrufen der Methode für diese Zahl. Sie müssen zwei Punkte verwenden (oder die Zahl in Klammern setzen) und können nicht einfach schreiben,42.toString(2)
da der Parser den Punkt als Dezimaltrennzeichen sieht und aufgrund eines fehlenden Punktoperators einen Fehler auslöst.Diese Antwort versucht, Eingaben mit einem Absolutwert im Bereich von 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1) zu adressieren .
In JavaScript werden Zahlen in einer 64-Bit-Gleitkommadarstellung gespeichert , aber bitweise Operationen zwingen sie zu 32-Bit-Ganzzahlen im Zweierkomplementformat. Daher beschränkt jeder Ansatz, der bitweise Operationen verwendet, den Ausgabebereich auf -2147483648 10 (-2 31 ). - 2147483647 10 (2 31 -1).
Wenn jedoch bitweise Operationen vermieden werden und die 64-Bit-Gleitkommadarstellung nur unter Verwendung mathematischer Operationen erhalten bleibt, können wir jede sichere Ganzzahl zuverlässig in die 64-Bit-Zweierkomplement- Binärnotation konvertieren, indem wir die 53-Bit-Zeichen vorzeichenerweiterern
twosComplement
:Für ältere Browser gibt es Polyfills für die folgenden Funktionen und Werte:
Number.isSafeInteger()
Number.isInteger()
Number.MAX_SAFE_INTEGER
String.prototype.padStart()
Als zusätzlichen Bonus können Sie jeden Radix (2–36) unterstützen, wenn Sie die Zweierkomplementkonvertierung für negative Zahlen in Ziffern ⌈64 / log 2 (Radix) ⌉ durchführen, indem Sie Folgendes verwenden
BigInt
:Wenn Sie an meiner alten Antwort interessiert sind
ArrayBuffer
, mit der eine Verbindung zwischen aFloat64Array
und a hergestellt wurdeUint16Array
, lesen Sie bitte den Revisionsverlauf dieser Antwort .quelle
-(2**53)-1
,2**53-1
anstatt sie nur-(2**31)
zu2**31-1
mögen.Eine Lösung, mit der ich mich für 32-Bit entscheiden würde, ist der Code am Ende dieser Antwort, der von developer.mozilla.org (MDN) stammt, aber mit einigen Zeilen für A) Formatierung und B) Überprüfung der Nummer ist in Reichweite.
Einige schlugen vor,
x.toString(2)
was für Negative nicht funktioniert, es steckt nur ein Minuszeichen für sie, was nicht gut ist.Fernando erwähnte eine einfache Lösung,
(x>>>0).toString(2);
die für Negative in Ordnung ist, aber ein kleines Problem hat, wenn x positiv ist. Der Ausgang beginnt mit 1, was für positive Zahlen kein richtiges 2s-Komplement ist.Jeder, der die Tatsache von positiven Zahlen, die mit 0 beginnen, und negativen Zahlen mit 1 im 2s-Komplement nicht versteht, könnte diese SO QnA im 2s-Komplement überprüfen. Was ist "2's Complement"?
Eine Lösung könnte darin bestehen, positiven Zahlen eine 0 voranzustellen, was ich in einer früheren Überarbeitung dieser Antwort getan habe. Und man könnte akzeptieren, manchmal eine 33-Bit-Zahl zu haben, oder man könnte sicherstellen, dass die zu konvertierende Zahl innerhalb des Bereichs liegt - (2 ^ 31) <= x <2 ^ 31-1. Die Zahl ist also immer 32 Bit. Aber anstatt das zu tun, können Sie mit dieser Lösung auf mozilla.org gehen
Patricks Antwort und Code sind lang und funktionieren anscheinend für 64-Bit, hatten aber einen Fehler, den ein Kommentator gefunden hat, und der Kommentator hat den Fehler von Patrick behoben, aber Patrick hat eine "magische Zahl" in seinem Code, die er nicht kommentiert hat und hat vergessen und Patrick versteht seinen eigenen Code nicht mehr vollständig / warum er funktioniert.
Annan hatte eine falsche und unklare Terminologie, erwähnte jedoch eine Lösung von developer.mozilla.org https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators Dies funktioniert für 32-Bit-Zahlen.
Der Code ist ziemlich kompakt, eine Funktion von drei Zeilen.
Aber ich habe einen regulären Ausdruck hinzugefügt, um die Ausgabe in Gruppen von 8 Bit zu formatieren. Basierend auf dem Drucken einer Zahl mit Kommas als Tausendertrennzeichen in JavaScript (Ich habe sie gerade geändert, indem ich sie in 3 Sekunden von rechts nach links gruppiert und Kommas hinzugefügt habe , in 8 Sekunden von rechts nach links gruppiert und Leerzeichen hinzugefügt habe ).
Und während Mozilla einen Kommentar zur Größe von nMask (der eingegebenen Nummer) abgegeben hat, dass sie im Bereich liegen muss, haben sie keinen Fehler getestet oder ausgelöst, wenn die Nummer außerhalb des Bereichs liegt fügte hinzu, dass.
Ich bin mir nicht sicher, warum sie ihren Parameter 'nMask' genannt haben, aber ich werde das so lassen, wie es ist.
Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
quelle
Sie können Ihre eigene Funktion schreiben, die ein Array von Bits zurückgibt. Beispiel zum Konvertieren von Zahlen in Bits
Teiler | Dividende | Bits / Rest
2 | 9 | 1
2 | 4 | 0
2 | 2 | 0
~ | 1 | ~
Beispiel der obigen Zeile: 2 * 4 = 8 und der Rest ist 1, also 9 = 1 0 0 1
Reste von unten nach oben lesen. Ziffer 1 in der Mitte nach oben.
quelle
Math.floor(number%2)
stattnumber = Math.floor(number/2)
?Ich habe einen anderen Ansatz gewählt, um etwas zu finden, das dies tut. Ich habe beschlossen, diesen Code nicht in meinem Projekt zu verwenden, aber ich dachte, ich würde ihn an einem relevanten Ort belassen, falls er für jemanden nützlich ist.
quelle
Noch eine Alternative
quelle
Das ist mein Code:
quelle
Das ist die Lösung. Tatsächlich ist es ganz einfach
quelle