Ich würde gerne ganze Zahlen, positiv oder negativ, in binärer Form sehen.
Eher wie この質問 sondern für JavaScript.
Ich würde gerne ganze Zahlen, positiv oder negativ, in binärer Form sehen.
Eher wie この質問 sondern für JavaScript.
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.
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
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));
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í
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
.
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"
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.
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"
Welchen Vorteil hat die Verwendung dieser Funktion gegenüber der Verwendung einer einfachen Number(num).toString(2)?
@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.
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 .
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?
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.
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 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.
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).
0 Stimmen
Diese Frage ist in höchstem Maße irreführend. "Vielleicht ein bisschen zweideutig" ist zu milde ausgedrückt. Warum taucht das 2er-Komplement weder im Titel noch im Text der Frage auf, wenn es das ist, was Sie eigentlich wollen? Genauso wenig wie ein mehr oder weniger gleichwertiger Ausdruck wie "interne Bit-String-Darstellung". Aus Ihrer Antwort und Ihren Kommentaren zu anderen Antworten schließe ich, dass es Ihnen nicht um das Binärsystem geht, sondern um das 2s-Komplement. Die Fragen, die Sie kritisieren, sehen für mich so aus, als ob sie auf genau Ihre Frage... Es sind nicht die Antworten, die schlecht sind - Ihre Frage ist es.
0 Stimmen
@dingalapadum Nun, bedenken Sie dies. Wie viele verschiedene Möglichkeiten gibt es (in der Praxis), positive und negative ganze Zahlen darzustellen? Es gibt die Vorzeichen-Magnituden-Methode, es gibt das 1er-Komplement und das 2er-Komplement. Und dann gibt es noch "irgendeine benutzerdefinierte Methode". Wenn jemand einen Weg aufzeigt, dann sollte er den Namen der Darstellung angeben. Wenn jemand "-1101" schreibt, ist das nicht binär, oder? Denn ein Minuszeichen ist keine binäre Ziffer. Wenn jemand sagt, dass 1 eine "1" und -1 eine "11111" ist, wie unterscheidet man dann mechanisch zwischen diesen beiden. Wie lautet der Name dieses Systems.
0 Stimmen
Wenn wir über die Darstellung von Zahlen in "x-ary" sprechen, meinen wir, dass wir x Ziffern verwenden, um die Größenordnung der Nummer. Das Vorzeichen der Zahl ist keine Ziffer und wird nicht für den Betrag verwendet. Das Vorzeichen ändert auch nicht den Betrag der Zahl. Ihre Frage bezieht sich auf die Kodierung von Zahlen in einer binären Zeichenfolge. In Ihrem Kommentar sagen Sie bereits, dass Sie sich für das 2er-Komplement interessieren. Warum schreiben Sie es also nicht in den Titel oder in die Frage selbst, um Missverständnisse zu vermeiden, diese Diskussion zu vermeiden und die Frage insgesamt klarer und qualitativ hochwertiger zu gestalten?
0 Stimmen
@dingalapadum Sie spucken nur weitere Ablenkungsmanöver aus, z.B. schreiben Sie mir als eine Art Argument, dass "1011 als Binärzahl verstanden werden kann" (Als ob das eine Neuigkeit sein soll oder ich etwas anderes behauptet hätte).
0 Stimmen
Ich habe "-1011" und nicht "1011" geschrieben. Negative Zahlen scheinen dein ganzes Problem mit den "falschen" Antworten zu sein, richtig? Wie auch immer. IMO ist die Frage in ihrer jetzigen Form von sehr schlechter Qualität und es wäre wirklich einfach, sie zu verbessern. Ich habe nur versucht zu erklären, warum ich so denke. Die "falschen" Antworten und Ihre eigenen Kommentare bestätigen dies. OTOH Sie haben immer noch nicht argumentiert, warum es besser ist, das 2er-Komplement nicht im Titel oder im Hauptteil der Frage zu erwähnen. Nach der Frage zu fragen, "wie man in Binärzahlen umwandelt", aber tatsächlich das 2er-Komplement als Antwort zu verlangen, ist (mit Ihren eigenen Worten) zweideutig . Warum wird die Frage dann nicht einfach präzisiert?
0 Stimmen
Wir wollen diese Diskussion im Chat fortsetzen .
0 Stimmen
Was ist eigentlich eine negative Null in binärer Form in Javascript? Es kann nur im 1er-Komplement sein? Es ist in der Regel als alle binären 1en dargestellt. - > 111111111.... nicht sicher, wie viele. Diese Referenz hat 32bit Zahl binäre Darstellung von -0 als 1 gefolgt von 31 Nullen. - de.wikipedia.org/wiki/Signed_zero
0 Stimmen
@JoePythonKing Was meinen Sie mit "Es kann nur im 1er-Komplement sein?" Du kommst aus Großbritannien, also kannst du vielleicht besser auf Englisch schreiben. Du kannst -1 im 1er-Komplement oder -1 im 2er-Komplement nachschlagen. Computer neigen dazu, das 2er-Komplement gegenüber dem 1er-Komplement zu bevorzugen, aber es ist kein Rätsel, wie man vom einen zum anderen kommt. Es gibt noch einige andere Darstellungen. Wie viele 1en bei negativen Zahlen, z. B. im 2er-Komplement, erforderlich sind, spielt keine Rolle, und wahrscheinlich wäre es auch für das 1er-Komplement egal. Es kommt darauf an, wie viele Bits Sie zum Speichern der Zahl haben!