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?

167
Niels Sønderbæk 4 Juni 2013 im 23:41

9 Antworten

Beste Antwort

Verwenden Sie die Funktion format():

>>> format(14, '#010b')
'0b00001110'

Die Funktion format() formatiert einfach die Eingabe nach Formatspezifikation Minisprache. Mit # enthält das Format das Präfix 0b, und die Größe 010 formatiert die Ausgabe so, dass sie in eine Breite von 10 Zeichen mit 0 Auffüllung passt. 2 Zeichen für das Präfix 0b, 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() und setzen Sie das zweite Argument für die Funktion format() nach dem Doppelpunkt des Platzhalters {:..}:

>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'

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():

>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format")  # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193

Aber ich würde das nur verwenden, wenn die Leistung in einer engen Schleife wichtig ist, da format(...) die Absicht besser kommuniziert.

Wenn Sie das Präfix 0b nicht möchten, lassen Sie einfach das # fallen und passen Sie die Länge des Felds an:

>>> format(14, '08b')
'00001110'
190
Martijn Pieters 22 März 2019 im 12:26

Sie können zfill verwenden:

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2)

Druckt:

01
10
100

Ich mag diese Lösung, da sie nicht nur bei der Ausgabe der Nummer hilft, sondern auch, wenn Sie sie einer Variablen zuweisen müssen ... z. - x = str (datetime.date.today (). month) .zfill (2) gibt x als '02' für den Monat Februar zurück.

-3
Anshul Garg 20 Sept. 2016 im 14:27

Sie können die Mini-Sprache für die Zeichenfolgenformatierung verwenden:

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])

Demo:

print binary(1)

Ausgabe:

'0b00000001'

BEARBEITEN: basierend auf der Idee von @Martijn Pieters

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))
8
Peter Varo 4 Juni 2013 im 20:03
module Adder(
    input upperBit, lowerBit, c_in,
    output s, c_out)

write gate1, gate2, gate3

xor (gate1, upperBit, lowerBit)
xor (s, gate1, c_in)
and (upperBit, lowerBit)
and (gate1, c_in)
or  (c_out, gate1, gate2)

endmodule

module ful_adder8(
    input [7:0) a, b
    input c_in
    output [7:0) s,
    output c_out)

write [7:0] carry

full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))

endmodule
test
def split (n):
    return (n&0x1,n&0x2,n&0x4,n&0x8,n&0x10,n&0x20,n&0x40,n&0x80)
def glue (b0,b1,b2,b3,b4,b5,b6,b7,c):
    t = 0
    if b0:
        t += 1
    if b1:
        t += 2
    if b2:
        t += 4
    if b3:
        t += 8
    if b4:
        t += 16
    if b5:
        t += 32
    if b6:
        t += 64
    if b7:
        t += 128
    if c:
        t += 256
    return t


def myadd (a,b):
    (a0,a1,a2,a3,a4,a5,a6,a7) = split(a)
    (b0,b1,b2,b3,b4,b5,b6,b7) = split(b)
    (s0,s1,s2,s3,s4,s5,s6,s7,c) = addEightBits(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7,false)
    return glue (s0,s1,s2,s3,s4,s5,s6,s7,c)
-3
Will 27 Dez. 2015 im 11:07

Sie können so etwas verwenden

("{:0%db}"%length).format(num)
0
Muds 31 März 2015 im 16:41

Manchmal möchten Sie nur einen einfachen Einzeiler:

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

Python 3

0
Mark 2 Jän. 2017 im 01:45
>>> '{:08b}'.format(1)
'00000001'

Siehe: Formatspezifikation Mini-Sprache


Hinweis: Für Python 2.6 oder älter können Sie die Positionsargument-ID nicht vor : weglassen. Verwenden Sie daher

>>> '{0:08b}'.format(1)
'00000001'      
111
Josselin 1 Aug. 2017 im 11:48

Ich benutze

bin(1)[2:].zfill(8)

Wird gedruckt

'00000001'
27
rekinyz 10 Dez. 2015 im 22:58

Bei Verwendung von Python >= 3.6 ist die Verwendung von f am saubersten -strings mit String-Formatierung:

>>> var = 23
>>> f"{var:#010b}"
'0b00010111'

Erläuterung:

  • var die zu formatierende Variable
  • : Alles danach ist der Formatbezeichner
  • # benutze das alternative Formular (fügt das Präfix 0b hinzu)
  • 0 Pad mit Nullen
  • 10 Pad auf eine Gesamtlänge von 10 (dies beinhaltet die 2 Zeichen für 0b)
  • b verwende eine binäre Darstellung für die Zahl
0
ruohola 9 Jän. 2020 im 15:34