Ich versuche, eine Ganzzahl mit der Funktion bin () in Python in eine Binärzahl umzuwandeln. Es werden jedoch immer die führenden Nullen entfernt, die ich tatsächlich benötige, sodass das Ergebnis immer 8-Bit ist:
Beispiel:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Gibt es eine Möglichkeit, dies zu tun?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
quelle
quelle
Antworten:
Verwenden Sie die
format()
Funktion :Die
format()
Funktion formatiert die Eingabe einfach gemäß der Minisprache Formatspezifikation . Das#
Format enthält das0b
Präfix, und die010
Größe formatiert die Ausgabe so, dass sie in eine Breite von 10 Zeichen mit0
Auffüllung passt . 2 Zeichen für das0b
Präfix, die anderen 8 für die Binärziffern.Dies ist die kompakteste und direkteste Option.
Wenn Sie das Ergebnis in eine größere Zeichenfolge einfügen , verwenden Sie ein formatiertes Zeichenfolgenliteral (3.6+) oder verwenden Sie
str.format()
das zweite Argument für dieformat()
Funktion nach dem Doppelpunkt des Platzhalters{:..}
:Selbst wenn Sie nur einen einzelnen Wert formatieren (ohne das Ergebnis in eine größere Zeichenfolge einzufügen), ist die Verwendung eines formatierten Zeichenfolgenliteral schneller als die Verwendung von
format()
:Aber ich würde das nur verwenden, wenn die Leistung in einer engen Schleife wichtig ist, da
format(...)
die Absicht besser kommuniziert wird.Wenn Sie das
0b
Präfix nicht wollten , lassen Sie es einfach fallen#
und passen Sie die Länge des Feldes an:quelle
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
{:..}
f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
.Siehe: Formatspezifikation Mini-Sprache
Hinweis: Für Python 2.6 oder älter können Sie die ID des Positionsarguments nicht auslassen.
:
Verwenden Sie sie daherquelle
str.format()
hier zu verwenden , wann diesformat()
der Fall ist. Ihnen fehlt das0b
Präfix.str.format
ist flexibler alsformat()
weil Sie mehrere Variablen gleichzeitig ausführen können . Ich vergesse immer wieder, dass dieformat
Funktion überhaupt existiert. Zugegeben, in diesem Fall ist es vollkommen ausreichend.str.format()
mit nur einem{}
Element und keinem anderen Text verwenden, verwenden Sie keine Zeichenfolgenvorlagen, sondern formatieren einen Wert . In diesem Fall einfach verwendenformat()
. :-)ich benutze
wird gedruckt
quelle
Sie können die Mini-Sprache für die Zeichenfolgenformatierung verwenden:
Demo:
Ausgabe:
BEARBEITEN : basierend auf der Idee von @Martijn Pieters
quelle
#
. Es gibt auchformat()
, was erspart, dass Sie eine vollständige Zeichenfolgenvorlage erstellen müssen.Bei Verwendung von Python
>= 3.6
ist es am saubersten, F-Strings mit String-Formatierung zu verwenden :Erläuterung:
var
die zu formatierende Variable:
Alles danach ist der Formatbezeichner#
Verwenden Sie das alternative Formular (fügt das0b
Präfix hinzu)0
Pad mit Nullen10
Pad auf eine Gesamtlänge von 10 (dies beinhaltet die 2 Zeichen für0b
)b
Verwenden Sie eine binäre Darstellung für die Zahlquelle
format(var, "#010b")
kommuniziert Absicht viel besser. Es ist jedoch die schnellste Option. Aber das wissen Sie schon, richtig, denn ich beschreibe bereits alles, was Sie in meiner Antwort gepostet haben.Manchmal möchten Sie nur einen einfachen Einzeiler:
Python 3
quelle
[ ]
nicht benötigt werden sollte -join()
akzeptiert einen Generatorausdruck.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
ein Generatoreingang vor dem Beitritt zunächst in eine Liste konvertiert wird , da zwei Durchgänge erforderlich sind. Dies beeinträchtigt die Leistung ein wenig und ist es hier eigentlich besser , ein Listenverständnis als einen Generatorausdruck einzugeben. Es ist eine Ausnahme von der Regel.Sie können so etwas verwenden
quelle
"{:0{l}b}".format(num, l=length)
Sie können die Rjust-String-Methode der Python-Syntax verwenden: string.rjust (Länge, Fillchar) Fillchar ist optional
und für deine Frage kannst du so schreiben
also wird es '0b00000001' sein
quelle
int
in ihre textuelle Binärdarstellung umzuwandeln, überhaupt nicht beantwortet wird . Sie beginnen nicht einmal mit einemint
.Sie können zfill verwenden:
Drucke:
Ich mag diese Lösung, da sie nicht nur bei der Ausgabe der Nummer hilft, sondern wenn Sie sie einer Variablen zuweisen müssen ... zB - x = str (datetime.date.today (). Month) .zfill (2) wird Geben Sie x als '02' für den Monat Februar zurück.
quelle
bin(14)
gibt es' '0b1110' 'undbin(14).zfill(8)
gibt' '000b1110' 'nicht' '0b00001110' ', was erwünscht ist