Nicht sicher, wie zu bekommen, was Sie wollen, mit dem Standard-lib. Es gibt eine Handvoll von Skripts und Pakete gibt, die die Umwandlung für Sie tun wird. Ich wollte nur wissen, warum. Und warum seine nicht lahm. Bin () gibt keine binären Bits zurück. Konvertiert er die Zahl in einen binären String. Die führende 0b teilt dem Interpreter mit, dass es sich um eine binäre Zahl handelt. Nach der pythonischen Sprachdefinition. Auf diese Weise können Sie direkt mit Binärzahlen arbeiten, wie dies nicht lahm ist. das ist großartig. Konvertieren einer ganzen Zahl in eine binäre Zeichenfolge. Integer - und Long-Integer-Literale werden durch die folgenden lexikalischen Definitionen beschrieben: Es funktioniert am besten, wenn Sie eine Maske zur Verfügung stellen. Auf diese Weise bestimmen Sie, wie weit zu signieren zu verlängern. Oder allgemeiner: In der Grundtheorie ist die tatsächliche Breite der Zahl eine Funktion der Größe der Lagerung. Wenn seine eine 32-Bit-Zahl, dann eine negative Zahl hat eine 1 in der MSB eines Satzes von 32. Wenn seine ein 64-Bit-Wert, dann gibt es 64 Bits zu zeigen. Aber in Python, Integer Präzision ist nur auf die Einschränkungen Ihrer Hardware beschränkt. Auf meinem Computer funktioniert das eigentlich. Aber es verbraucht 9GB RAM nur um den Wert von x zu speichern. Alles höher und ich bekomme einen MemoryError. Wenn ich mehr RAM hatte, konnte ich größere Zahlen speichern. Also mit dem im Verstand, welche Binärzahl -1 repräsentiert. Python ist gut in der Lage, buchstäblich Millionen (und sogar Milliarden) Bits der Genauigkeit zu interpretieren, wie das vorhergehende Beispiel zeigt. In 2s Komplement, das Zeichen-Bit erstreckt sich den ganzen Weg nach links, aber in Python gibt es keine vordefinierte Anzahl von Bits gibt es so viele wie Sie benötigen. Aber dann laufen Sie in Mehrdeutigkeit: Binäres 1 repräsentiert 1. oder -1. Nun, es könnte auch sein. Steht 111 für 7 oder -1. Wieder könnte es entweder sein. So repräsentiert 111111111 511. oder -1. Gut, beides, je nach Ihrer Präzision. Python braucht einen Weg, um diese Zahlen in binär, so dass theres keine Mehrdeutigkeit ihrer Bedeutung. Das Präfix 0b sagt nur, dass diese Zahl binär ist. Genau wie 0x bedeutet diese Zahl in Hex. Wenn ich also 0b1111 sage. Wie ich weiß, ob der Benutzer will -1 oder 15 Es gibt zwei Möglichkeiten: Option A: Das Vorzeichen-Bit Sie könnten deklarieren, dass alle Zahlen signiert sind, und das linkste Bit ist das Vorzeichen-Bit. Das bedeutet, 0b1 ist -1, während 0b01 1 ist. Das bedeutet auch, dass 0b111 auch -1 ist, während 0b0111 7 ist. Am Ende ist dies wahrscheinlich mehr verwirrend als hilfreich, vor allem, weil die meisten binären Arithmetik sowieso unsigned wird, Und die Menschen sind eher zu Fehlern führen, indem versehentlich eine Zahl als negativ markiert, weil sie nicht ein explizites Zeichen-Bit enthalten. Option B: Die Vorzeichenanzeige Mit dieser Option werden Binärzahlen vorzeichenlos dargestellt, und negative Zahlen haben ein - Präfix, genau wie in der Dezimalzahl. Dies ist (a) konsistent mit der Dezimalzahl, (b) kompatibler mit der Art, wie binäre Werte am wahrscheinlichsten verwendet werden. Sie verlieren die Fähigkeit, eine negative Zahl mit seiner Zweierkomplementdarstellung zu spezifizieren, aber denken Sie daran, dass Zweierkomplement ein Speicherimplementierungsdetail ist, nicht eine richtige Indikation des zugrunde liegenden Wertes selbst. Es sollte nicht etwas sein, dass der Benutzer zu verstehen hat. Am Ende macht Option B das sinnvollste. Theres weniger Verwirrung und der Benutzer ist nicht erforderlich, um die Lagerung Details zu verstehen. Bevor Sie diese Frage beantworten können, müssen Sie die verschiedenen binären Kodierungen zu sprechen. Die beiden in Frage sind 2s Komplement und Zeichen-Magnitude Null und positive Zahlen sind, wie Sie wahrscheinlich erwarten. Nehmen wir an, wir haben 4 Bit binär. 0000 ist null, 0001 ist eins, 0010 ist zwei, etc. Jede Ziffernposition ist wert die Zahlbasis mal die eine auf seinem Recht. Das Recht ist am meisten wert. Daher sind in Binär die Ziffernpositionen von rechts nach links 1, 2, 4 und 8 wert. Um eine Zahl zu decodieren, multiplizieren Sie jede Ziffer mit dem Wert ihrer Bitposition und addieren die Ergebnisse. Beispielsweise wäre 1010 1x8 0x4 1x2 0x1 zehn. Dies ist genau, wie Zahlen in andere Basen, einschließlich der Dezimalzahl geschrieben werden. Die Dezimalzahl 1234 hat den Wert 1x1000 2x100 3x10 4x1. Das Problem ist, wie negative Zahlen darzustellen. Beim Schreiben in Dezimalzahl setzen wir ein negatives Vorzeichen vor die Zahl. Das ist ziemlich viel, was Zeichen-Größe Binärdarstellung zu. Üblicherweise wird das hohe Bit als Vorzeichenbit reserviert, wobei 0 Null oder Positiv und 1 Indikator negativ anzeigt. Der Rest der Bits hat die gleiche Bedeutung wie zuvor. Zum Beispiel, mit 4-Bit-Zahlen wieder, 0101 ist fünf (1x4 0x2 1x1). Um negatives 5 zu machen, setzen wir einfach das Vorzeichenbit, was zu 1101 führt. So hat die Binärzahl 1101 im 4-Bit-Vorzeichenformat den Wert minus fünf. Die oben genannten funktioniert gut und ist viel wie das, was wir tun uns mit dezimal, aber seine nicht so bequem mit Logik-Gates in einem Computer zu implementieren. Heutzutage ist 2s Komplement ziemlich universell in Computern. Null und positive Zahlen werden wie vorher dargestellt. Der Unterschied ist, wie negative Zahlen dargestellt werden. Ein Vorteil der 2s Komplement ist, dass nichts Besonderes getan werden muss, um negative versus positive Zahlen hinzuzufügen. Denken Sie darüber nach, welches Bitmuster zu 0000 führen würde, nachdem Sie 1 dazu hinzugefügt haben. Wenn die Additionsregel befolgt wird, muss diese Zahl immer -1 sein. Hoffentlich wissen Sie, wie Sie binäre Zahlen hinzufügen und sehen können, dass 1111 0001 Ergebnisse in 0000. Tatsächlich ergibt sich in 10000, aber da wir nur mit 4-Bit-Zahlen zu tun haben, ist das fünfte Bit, das aus der Addition geht verloren und wir sind links Mit den niedrigen 4 Bits 0000. Es gibt nur 16 mögliche Werte einer 4-Bit-Binärzahl darstellen können, und wenn Sie die 2s Komplement-Schema sind sie: So vielleicht können Sie sehen, dass die Frage, die Sie gefragt, ist zweideutig. Es ist wichtig, die Breite der verwendeten Binärzahl zu kennen. Wenn beispielsweise die Frage 4 Bitzahlen als obiges Beispiel annimmt, dann ist 11 (angenommen, dass sie 0011 mit den führenden Nullen nicht gezeigt ist) drei. Das gleiche gilt für eine Bitbreite von 3 oder mehr. Wenn es nur 2 Bits sind, dann gibt es nur 4 mögliche Werte, die eine solche Zahl ausdrücken kann. Dies ist Ihre Hausaufgaben, so Im nicht nur gehen, um Ihnen die Antwort. Ein guter Weg, um fortzufahren wäre, um eine Tabelle aller möglichen 2-Bit-Binärzahlen und ihre dezimalen Äquivalente wie ich oben, aber für beide 2s Komplement und Zeichen-Größe machen. Wenn Sie zumindest einen vernünftigen Versuch zeigen, können wir darüber diskutieren. Eine 2-Bit-Signatur-Nummer kann nicht -3 in zwei Komplement oder in Zeichen-Größe darstellen. Twos-Komplement hat einen zusätzlichen negativen Wert (der keine additive Inverse hat). Die Zeichengröße hat zwei Nullen. Nun sehen wir uns Ihre Frage an. Kein Null-Bit-Muster kann einen negativen Wert in einer Darstellung und einen positiven Wert in dem anderen haben. In beiden Darstellungen fungiert das hohe Bit als negatives Vorzeichen. Daher können die Antworten 2 und 4 keine korrekten Antworten für jedes Bitmuster sein. Außerdem kann in beiden Darstellungen kein Bitmuster den gleichen negativen Wert haben. Ein Bitmuster kann nicht -3 in Zweierkomplement und -3 in Einkomplement sein. Also Antwort 3 ist auch unmöglich. (Beweis: Zweierkomplement -3, in beliebiger Breite, endet in 01: 101, 1101, 11101. aber eine Zeichengröße -3 muss in 11: 111, 1011, 10011 enden.) Die einzig mögliche richtige Antwort für ein Bitmuster Ist 1: Es ist jedoch nicht die richtige Antwort für das gegebene Bitmuster 11. Die in 1 beschriebene Situation ist möglich, und sie passt das Bitmuster 1111 unter einer vier Bit-Arithmetik. Diese Zahl ist -3 in vier Bit-Zeichengröße und -1 in vier Bit-Zweierkomplement. Die Frage muss einen Tippfehler haben, oder Sie haben es falsch kopiert. Wenn ein Lösungsleitfaden, den Sie suchen, C als Lösung für eine Multiple-Choice-Frage gibt, deren Antworten numerisch angegeben sind, sehen Sie wahrscheinlich den falschen Lösungsleitfaden. Falsches Kapitel, falsches Kapitel, falsches Lehrbuch. Dies scheint wie ein unwahrscheinlicher Fehler. M Zeichengröße verwendet das signifikanteste Bit, um das Vorzeichen zu bezeichnen. 0 ist meist positiv, 1 negativ. Bei einer 2-Bit-Zahl wie 0b11 ist das Vorzeichenbit mit nur 2 möglichen Werten für die Größenordnung 0 und 1 negativ. In diesem Fall wäre es -1. Aber das ist keine Option. Ich denke, sie wollten fragen Die Binärzahl 0b111 repräsentiert. Dies würde mehr Sinn machen, da 0b111 negativ wäre, mit einer Grße von 3 für die Zeichengrßenform. Oder -3, die eine der Optionen ist. Twos Komplement ist ein bisschen komplizierter, aber nicht viel. Twos-Komplement verwendet das Bit höchster Ordnung, um auch Negativität zu bezeichnen. Die Größe einer negativen Zahl wird durch Komplementieren der Zahl gefunden (0b111 wird 0b000, 0b101 würde 0b010 werden) und addiert 1. Dieses klingt albern, aber es macht Addition von signierten Zahlen sehr einfach, keine zusätzliche Logik ist erforderlich. Die Größe einer positiven Zahl (mit dem höchstwertigen Bit 0) ist einfach die Zahl. Also die Zahl ist (Im angenommen) 0b111, also sein Negativ. Ergänzen Sie es und fügen Sie ein ergibt 0b000, dann 0b001, so dass seine negative und ihre Größe ist 1, so seine -1. Damit. Es sei denn, ich bin völlig falsch, und ich könnte erwägen, dass ich havent getan dies per Hand für eine Weile, ist die Antwort (1), nicht (3) (oder C), wie Sie vorgeschlagen. Aber da die Frage, wie Sie tippte es war offensichtlich falsch, könnte die ganze Sache nur falsch sein. Ich muss nur fragen, welches Lehrbuch das ist. Sie mischen das Konzept der binären Zahlen mit der ganz spezifischen Art und Weise sind sie in der C-Computer-Sprache dargestellt. Wenn Sie eine bestimmte Sprachkonvention verwenden wollen, die nichts mit der Frage zu tun hat, sollten Sie zumindest klar sagen, dass. Ndash Olin Lathrop May 20 12 at 19:46 UM ist nur mit dem Präfix 0b eine Binärzahl zu bezeichnen. AFAIK das ist nicht gültig C (obwohl es von einigen Compilern akzeptiert wird). Ndash Wouter van Ooijen Mai 20 12 at 20:49 Wouter: Obwohl es von C kam, aber der Punkt ist, dass es spezifisch für eine bestimmte Computer-Sprache, nicht allgemeine Mathematik, die diese Frage ist. Zum Beispiel, in Apollo Domain Pascal würden Sie schreiben 2101 für den Wert 5 binär, aber ich wouldn39t verwenden, um eine Frage zu beantworten, es sei denn, es war über diese Sprache oder ich definiert die Konvention, die ich verwendete. ndash Olin Lathrop 20. Mai 12 an 21: 13A schnell Funktion eine binäre Zeichenkette in eine Bitfolge Funktion BinString2BitSequence (mystring) mybitseq Ende strlen (mystring) zu konvertieren (i 0 i lt i end) myByte decbin (ord (myString i)) // konvertieren von char zu bit string mybitseq. Substr (00000000. 0. 8 - strlen (mybyte)). Mybyte // 8 Bit gepackte Rückgabe mybitseq echo BinString2BitSequence (ABCDEF) // OUTPUT010000010100001001000011010001000100010101000110 Dezimal-zu-Binär-Konvertierung mit der BCMath-Erweiterung. Funktion BCDec2Bin (Eingang) Ausgang wenn (pregmatch (/ d /. Eingang)) während (Eingang 0) Ausgang. Chr (48 (Eingang 2)) Eingang BCDiv (Eingang 2) Ausgang strrev Ausgang Ausgang 0 (Ausgang Ausgang) 0) Dies wird einfach von Base-10 zu Base-2 mit BCMath umgesetzt (beliebige Genauigkeitsberechnung). Siehe auch: meine BCBin2Dec-Funktion auf dem bindec-Dokument. Genießen Sie, Stickstoff. Hallo Leute, ich kämpfte für einen Tag, um eine große Dezimalzahl in binäre, auf der Windows-Plattform umgewandelt bekommen. Schließlich mit bcmath Funktionen das ist, was für mich gearbeitet. // hat es mit bcmath-Funktionen zu arbeiten, arbeitet für 64-Bit auf 32-Bit-Windows-Rechner beendet0 base2 binnr if (pregmatch (/ 0-9 /, string)) für (i0 stringchr (i) i) decnri else decnrstring // while (decnrgtbase), während (bccomp (decnr, Basis) 1) // if ((decnr-Basis) GT0) if (bccomp (bcsub (decnr, Basis). 0) 1) // decnrdecnr-base decnrbcsub (decnr, Basis) Binnr.1 // Basebase / 2 Basebcdiv (Base, 2) // elseif ((decnr-Base) lt0) - Erstif (bccomp (bcsub (decnr, base)) 0) -1) binnr.0 / basebase / 2 basebcdiv (Base, 2) // elseif ((decnr-base) 0) elseif (bccomp (bcsub (decnr, base) 0) 0) binnr.1 finished1 // while (basegt1) während (bccomp (Basis, 1) ) binnr.0 // basebase / 2 basebcdiv (Base, 2) Hier finden Sie 64-Bit anstelle von 32-Bit mit dem Standard decbin lt Funktion bigdecbin (dec doublewords1) erg dec2147483648 if (restlt0) rest2147483648 erg strpad (decbin (Rest konvertieren ruhen ), 31,0, STRPADLEFT).erg Dezember (dec-rest) / 2147483648 while ((decgt0) ampamp ((declt1))) echo ltpregt für (i1.52147483647.0-10ilt1.52147483647.010i) echo Dezember:.i. BIN:.bigdecbin (i, 2).ltbrgt Echo lt / pregt gt ltphp drucken bindecValues (1023) Funktion bindecValues (dezimal falsch umkehren inversen falsch..) / 1. Diese Funktion eine Dezimalzahl nimmt, wandelt sie in binäre und gibt die Dezimalzahl Werte von jedem einzelnen binären Wert (a 1) in der binären Zeichenfolge. Sie können größere Dezimalwerte verwenden, wenn Sie sie an die Funktion als String 2 übergeben. Der zweite optionale Parameter kehrt die Ausgabe um. 3. Der dritte optionale Parameter invertiert den binären String, zB wird 101 zu 010. - darkshad3 bei yahoo dot com / bin decbin (dezimal) if (invers) bin strreplace (0. x. Bin) bin strreplace (1. 0. bin ) Bin strreplace (x. 1. bin) Gesamtstrlen (bin) für (i 0 i lt gesamt i) wenn (bin 0) bin2 strpad (bin, total - i. 0) arraypush (Bestand bindec (bin2)) umgekehrt . Rsort (stock): sort (stock) return implode (,. Stock) gt Das gedruckte Ergebnis ist. 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 Ich denke, dies ist die beste Funktion. Ist fast endlos (bis 250 oder etwas), während (i gt 0) if (int - pow (2. i) lt 0) binair 0. binair sonst binair 1. binair int int - pow (2. i) getal GET getal Sorgfältig versuchen, binäre weise Tests mit ganzen Zahlen: FFFFFFFF Befehl ein: php - r print (decbin (4294967295) · n) Ergebnis: 11111111111111111111111111111111 C3E9CAC8 Befehl: php - r print (decbin (3286878920) · n) Ergebnis: 11000011111010011100101011001000 unabhängig davon Angabe (int) , Mit bitweisem Befehl AND: Befehl: php - r print ((int) (3286878920 amp 4294967295).n) Ergebnis: -1008088376 (int) Jetzt wird das erwartete Ergebnis passieren (vermutlich der Performance-Auswirkung) Befehl: php - r print (bindec (Decbin ((3286878920 amp 4294967295))) n) Ergebnis: 3286878920 (float) Zusätzliche Anmerkung: Wenn Sie bitweise und einige zufällige Bits mit einer Folge von 1 Bit der gleichen Länge, ist das erwartete Ergebnis die gleiche zufällige Bits unverändert. Wenn Sie dies in der Integer-Welt für schnellere Vergleiche behalten möchten, riskieren Sie, Ihr Ergebnis für die signierte Integer-Größenbeschränkung zu messen. Der maximale Wert, den Sie für das gewünschte Ergebnis verwenden können, ist (7FFFFFFF - oder integer 2147483647), die Hälfte des vorzeichenlosen 32-Bit-Maximalwertes (plattformabhängig).
Comments
Post a Comment