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?
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?
Antworten:
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 .
bin(255)-> '0b11111111'. Weitere Details finden Sie in dieser Antwort .
>>>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.
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.
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))])
add = lambda x, y: x + y, int.__add__kann zur Reduzierung bereitgestellt werden. ZBreduce(int.__add__, ...)
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')
Eine rekursive Python-Implementierung:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [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.
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