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?


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'

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'

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'

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>")

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

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'

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'

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

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

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)

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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.