502 Stimmen

Base-2-Binärzahl-String in int konvertieren

Ich möchte einfach eine Base-2-Binärzahl-String in eine int, etwas wie dieses konvertieren:

>>> '11111111'.fromBinaryToInt()
255

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

5voto

Geoffrey Anderson Punkte 1353

Für große Matrizen (10**5 Zeilen und mehr) ist es besser, ein vektorisiertes matmult zu verwenden. Dabei werden alle Zeilen und Spalten in einem Durchgang eingegeben. Das ist extrem schnell. In Python gibt es hier keine Schleifen. Ursprünglich habe ich es entwickelt, um viele binäre Spalten 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

5voto

The Zach Man Punkte 698

Hier ist noch eine weitere Möglichkeit, die in keiner der obigen Antworten erwähnt wird:

>>> eval('0b' + '11111111')
255

Zugegeben, es ist wahrscheinlich nicht sehr schnell, und es ist eine sehr, sehr schlechte Idee, wenn die Zeichenkette von etwas kommt, über das Sie keine Kontrolle haben und das bösartig sein könnte (z. B. Benutzereingaben), aber der Vollständigkeit halber: es funktioniert.

4voto

Eine rekursive Python-Implementierung:

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

4voto

Robert Ranjan Punkte 1224

Wenn Sie Python 3.6 oder höher verwenden, können Sie f-string verwenden, um die Umwandlung vornehmen:

Binär zu dezimal:

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

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

binär zu oktal hexa und usw.

>>> 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[:]

:#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 zu ändern, um oktal/hexadezimal/dezimal zu haben.

4voto

ClementWalter Punkte 4043

Für das Protokoll, um hin und her in grundlegenden python3 gehen:

a = 10
bin(a)
# '0b1010'

int(bin(a), 2)
# 10
eval(bin(a))
# 10

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X