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.
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.
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"
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/
Sie können Ihre eigene Funktion schreiben, die ein Array von Bits zurückgibt. Beispiel für die Umwandlung von Zahlen in Bits
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.
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/
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
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)
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.
@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)
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.
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 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!