Konvertieren Sie die Basis-2-Binärzahl in int

306

Ich möchte einfach eine Basis-2-Binärzahl in eine int konvertieren, ungefähr so:

>>> '11111111'.fromBinaryToInt()
255

Gibt es eine Möglichkeit, dies in Python zu tun?

Naftuli Kay
quelle
3
Während es nicht wirklich wichtig ist, bedeutet eine Binärzeichenfolge normalerweise eine Zeichenfolge, die tatsächliche Binärdaten enthält (ein Byte enthält zwei hexadezimale Ziffern, dh "\ x00" ist ein Nullbyte).
TrevorKirkby

Antworten:

563

Sie verwenden die integrierte intFunktion und übergeben ihr die Basis der eingegebenen Nummer, dh 2für eine Binärzahl:

>>> int('11111111', 2)
255

Hier finden Sie eine Dokumentation für Python2 und für Python3 .

entspannen
quelle
61
Falls jemand das Gegenteil sucht: bin(255)-> '0b11111111'. Weitere Details finden Sie in dieser Antwort .
Akseli Palén
7
Es ist zu beachten, dass dies nur für vorzeichenlose binäre Ganzzahlen funktioniert. Bei vorzeichenbehafteten Ganzzahlen sind die Konvertierungsoptionen ein Chaos.
Gefälschter Name
2
Wie geht das in Python 3?
Saras Arya
2
@ SarasArya Es ist sehr ähnlich! :) Ich habe aktualisiert, siehe oben.
Entspannen Sie
1
Beachten Sie außerdem, dass Sie in einer interaktiven REPL-Sitzung (wie von der >>>Eingabeaufforderung vorgeschlagen) überhaupt keine Verwendung benötigen print. Das hypothetische Beispiel des OP tat es nicht. Also sollte es in Python 2 und 3 wirklich identisch sein.
John Y
37

Geben Sie einfach 0b11111111 in die interaktive Python-Oberfläche ein:

>>> 0b11111111
    255
lengxuehx
quelle
28

Eine andere Möglichkeit, dies zu tun, ist die Verwendung des bitstringModuls:

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255

Beachten Sie, dass sich die vorzeichenlose Ganzzahl von der vorzeichenbehafteten Ganzzahl unterscheidet:

>>> b.int
-1

Das bitstringModul ist keine Voraussetzung, verfügt jedoch über viele performante Methoden, um Eingaben in und von Bits in andere Formen umzuwandeln und diese zu bearbeiten.

Alex Reynolds
quelle
8

Die Verwendung von int mit base ist der richtige Weg. Früher habe ich das gemacht, bevor ich herausgefunden habe, dass int auch Basis ist. Es handelt sich im Grunde genommen um eine Reduzierung, die auf ein Listenverständnis der primitiven Art der Konvertierung von Binär in Dezimal angewendet wird (z. B. 110 = 2 ** 0 * 0 + 2 ** 1 * 1 + 2 ** 2 * 1).

add = lambda x,y : x + y
reduce(add, [int(x) * 2 ** y for x, y in zip(list(binstr), range(len(binstr) - 1, -1, -1))])
Saurabh Hirani
quelle
4
Anstatt zu definieren add = lambda x, y: x + y, int.__add__kann zur Reduzierung bereitgestellt werden. ZBreduce(int.__add__, ...)
Jordan Jambazov
4

Wenn Sie wissen möchten, was hinter den Kulissen passiert, dann sind Sie hier.

class Binary():
def __init__(self, binNumber):
    self._binNumber = binNumber
    self._binNumber = self._binNumber[::-1]
    self._binNumber = list(self._binNumber)
    self._x = [1]
    self._count = 1
    self._change = 2
    self._amount = 0
    print(self._ToNumber(self._binNumber))
def _ToNumber(self, number):
    self._number = number
    for i in range (1, len (self._number)):
        self._total = self._count * self._change
        self._count = self._total
        self._x.append(self._count)
    self._deep = zip(self._number, self._x)
    for self._k, self._v in self._deep:
        if self._k == '1':
            self._amount += self._v
    return self._amount
mo = Binary('101111110')
Mohammad Mahjoub
quelle
3

Eine rekursive Python-Implementierung:

def int2bin(n):
    return int2bin(n >> 1) + [n & 1] if n > 1 else [1] 
Ludovic Trottier
quelle
1

Wenn Sie python3.6 oder höher verwenden, können Sie die Konvertierung mit f-string durchführen:

Binär bis dezimal:

>>> print(f'{0b1011010:#0}')
90

>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90

binär zu oktal hexa und etc.

>>> f'{0b1011010:#o}'
'0o132'  # octal

>>> f'{0b1011010:#x}'
'0x5a'   # hexadecimal

>>> f'{0b1011010:#0}'
'90'     # decimal

Achten Sie auf 2 Informationen, die durch einen Doppelpunkt getrennt sind.

Auf diese Weise können Sie zwischen {binär, oktal, hexadezimal, dezimal} in {binär, oktal, hexadezimal, dezimal} konvertieren, indem Sie die rechte Seite des Doppelpunkts [:] ändern.

:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal 
:#0 -> converts to decimal as above example

Versuchen Sie, die linke Seite des Doppelpunkts so zu ändern, dass sie oktal / hexadezimal / dezimal ist.

Robert Ranjan
quelle
0

Für große Matrix (10 ** 5 Zeilen und mehr) ist es besser, ein vektorisiertes Matmult zu verwenden. Pass in allen Reihen und Spalten in einem Schuss. Es ist extrem schnell. In Python gibt es hier keine Schleifen. Ich habe es ursprünglich entworfen, um viele Binärspalten wie 0/1 für etwa 10 verschiedene Genre-Spalten in MovieLens in eine einzelne Ganzzahl für jede Beispielzeile zu konvertieren.

def BitsToIntAFast(bits):
  m,n = bits.shape
  a = 2**np.arange(n)[::-1]  # -1 reverses array of powers of 2 of same length as bits
  return bits @ a
Geoffrey Anderson
quelle