Konvertieren einer Ganzzahl in eine Binärzahl in Python

179

Um eine Ganzzahl in eine Binärzahl umzuwandeln, habe ich diesen Code verwendet:

>>> bin(6)  
'0b110'

und wann ich die '0b' löschen soll, benutze ich Folgendes:

>>> bin(6)[2:]  
'110'

Was kann ich tun, wenn ich 6als 00000110statt zeigen möchte 110?

Schmied
quelle
2
Mögliches Duplikat von Python int zu binär?
Martin Thoma

Antworten:

355
>>> '{0:08b}'.format(6)
'00000110'

Nur um die Teile der Formatierungszeichenfolge zu erklären:

  • {} Platziert eine Variable in einer Zeichenfolge
  • 0 nimmt die Variable an Argumentposition 0
  • :fügt Formatierungsoptionen für diese Variable hinzu (andernfalls würde sie eine Dezimalzahl darstellen 6)
  • 08 formatiert die Zahl auf acht Ziffern, die links mit Nullen aufgefüllt sind
  • b konvertiert die Zahl in ihre binäre Darstellung

Wenn Sie eine Version von Python 3.6 oder höher verwenden, können Sie auch F-Strings verwenden:

>>> f'{6:08b}'
'00000110'
Eumiro
quelle
7
Das erste 0bedeutet das 0thArgument zu format. Nachdem der Doppelpunkt die Formatierung ist, 0bedeutet der zweite b
Nullfüllung
@Aif: Schauen Sie sich auch die Standarddokumentation docs.python.org/library/…
pepr
19
Dies kann mit der format() Funktion vereinfacht werden : format(6, '08b'); Die Funktion verwendet einen Wert (für den der {..}Steckplatz gilt) und eine Formatierungsspezifikation (was auch immer Sie nach dem :in die Formatierungszeichenfolge setzen würden ).
Martijn Pieters
4
'{0:08b}'.format(-6)-> '-0000110'. Was ist, wenn Sie kein Schild wollen? struct? -6%256?
n611x007
1
@ AK47 Ja, seit Pythoon 2.6 können Sie int-Konstanten in binärer Form mit dem Präfix 0b oder 0B schreiben: 0b00000110
Denis Barmenkov
102

Nur eine andere Idee:

>>> bin(6)[2:].zfill(8)
'00000110'

Kürzere Methode über String-Interpolation ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
quelle
7
Beachten Sie, dass diese Lösung schneller ist als die akzeptierte . Welche Lösung klarer ist (oder, ich kann es nur sagen, Pythonic), ist wahrscheinlich eine Frage des persönlichen Geschmacks.
Air
Ich lerne immer noch die Essenz der Pythonalität, aber das ist eindeutig viel vielseitiger. Ich war anfangs aufgeregt, die akzeptierte Lösung mit ihrer eleganten Erklärung zu sehen, war jedoch alarmiert, dass das Objekt, das für die Ausführung der Methoden aufgerufen wurde, als einzelne Zeichenfolge mit allen integrierten Spezifikationen geschrieben wurde, wodurch die Einbeziehung von Variablen in Dinge wie die gewünschte Länge entfiel der Bitstring. Dies löst das vollständig und ist so intuitiv (zumindest für Python 2), dass nicht jedes Zeichen erklärt werden muss!
Post169
Funktioniert nicht für negative Ganzzahlen bin(-6)[2:].zfill(8)als'0000b110'
jlandercy
20

Ein bisschen Twiddling-Methode ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
sobel
quelle
1
Schöne Methode. Aber ich konnte nicht verstehen, was dieser Teil Ihres Codes tut: str ((x >> i) & 1)
Gregory
2
@Gregory: Es verschiebt die Bits xnach rechts und UNDs mit 1, wodurch effektiv jeweils ein Bit (0 oder 1) extrahiert wird.
usr2564301
16

Verwenden Sie einfach die Formatierungsfunktion

format(6, "08b")

Die allgemeine Form ist

format(<the_integer>, "<0><width_of_string><format_specifier>")
der Eine
quelle
1
Ja, ich mag dieses, es ist einfach und eines der schnellsten :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

Die Antwort von eumiro ist besser, aber ich poste dies nur aus Gründen der Abwechslung:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
quelle
3
Heh. Das ist einfach so falsch, ich musste es positiv bewerten. Das Interpretieren der Ziffern als Dezimalzahl ist geschickt. Noch schlimmer:'%08x' % int(bin(6)[2:], 16)
Mad Physicist
6

.. oder wenn Sie nicht sicher sind, ob es immer 8-stellig sein soll, können Sie es als Parameter übergeben:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
thebjorn
quelle
5

numpy.binary_repr(num, width=None) hat ein magisches Breitenargument

Relevante Beispiele aus der oben verlinkten Dokumentation:

>>> np.binary_repr(3, width=4)
'0011'

Das Zweierkomplement wird zurückgegeben, wenn die Eingabenummer negativ ist und die Breite angegeben wird:

>>> np.binary_repr(-3, width=5)
'11101'
Tom Hale
quelle
4

Going Old School funktioniert immer

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))
Shadrack Kimutai
quelle
number=number/2gibt float, also number=number//2number=number//2number//=2b=b+"0"b+="0"
nähte
Außerdem haben Sie nicht die 0-Polsterung als OP erforderlich
Brambor
1
('0' * 7 + bin(6)[2:])[-8:]

oder

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
quelle
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Nic3500
0

Angenommen, Sie möchten die Anzahl der Ziffern analysieren, die zur Darstellung einer Variablen verwendet werden, die nicht immer konstant ist. Eine gute Möglichkeit ist die Verwendung von numpy.binary.

Dies kann nützlich sein, wenn Sie Binärdateien auf Stromversorgungssätze anwenden

import numpy as np
np.binary_repr(6, width=8)
ama
quelle
0

Am besten geben Sie das Format an.

format(a, 'b')

Gibt den Binärwert von a im String-Format zurück.

Verwenden Sie die Funktion int (), um eine Binärzeichenfolge wieder in eine Ganzzahl umzuwandeln.

int('110', 2)

Gibt einen ganzzahligen Wert der Binärzeichenfolge zurück.

Pranjalya
quelle
Besser wäre das Format (a, '08b'), um das vom Benutzer gewünschte Format zu erhalten.
ZSG
0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Dmity Bryuhanov
quelle