Je voudrais simplement convertir une chaîne de nombres binaires base-2 en entier, quelque chose comme ceci:
>>> '11111111'.fromBinaryToInt()
255
Existe-t-il un moyen de le faire en Python?
Je voudrais simplement convertir une chaîne de nombres binaires base-2 en entier, quelque chose comme ceci:
>>> '11111111'.fromBinaryToInt()
255
Existe-t-il un moyen de le faire en Python?
Réponses:
Vous utilisez la int
fonction intégrée et lui passez la base du numéro d'entrée, c'est- 2
à- dire pour un nombre binaire:
>>> int('11111111', 2)
255
bin(255)
-> '0b11111111'
. Voir cette réponse pour plus de détails.
>>>
invite), vous n'avez pas besoin du tout d'utiliser print
. L'exemple hypothétique du PO ne l'a pas fait. Donc, il devrait vraiment être identique en Python 2 et 3.
Une autre façon de le faire est d'utiliser le bitstring
module:
>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
Notez que l'entier non signé est différent de l'entier signé:
>>> b.int
-1
Le bitstring
module n'est pas une exigence, mais il a beaucoup de méthodes performantes pour transformer l'entrée en et à partir de bits dans d'autres formes, ainsi que pour les manipuler.
Utiliser int avec base est la bonne solution. J'avais l'habitude de le faire avant de trouver également la base int. Il s'agit essentiellement d'une réduction appliquée sur une liste de compréhension de la manière primitive de convertir le binaire en décimal (par exemple 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__
on peut prévoir de réduire. Par exemplereduce(int.__add__, ...)
Si vous voulez savoir ce qui se passe derrière la scène, alors c'est parti.
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')
Une implémentation récursive de Python:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [1]
Si vous utilisez python3.6 ou version ultérieure, vous pouvez utiliser la chaîne f pour effectuer la conversion:
Binaire à décimal:
>>> print(f'{0b1011010:#0}')
90
>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90
hexa binaire à octal et etc.
>>> f'{0b1011010:#o}'
'0o132' # octal
>>> f'{0b1011010:#x}'
'0x5a' # hexadecimal
>>> f'{0b1011010:#0}'
'90' # decimal
Faites attention à 2 informations séparées par deux points.
De cette façon, vous pouvez convertir entre {binaire, octal, hexadécimal, décimal} en {binaire, octal, hexadécimal, décimal} en changeant le côté droit des deux points [:]
:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal
:#0 -> converts to decimal as above example
Essayez de changer le côté gauche du côlon pour avoir octal / hexadécimal / décimal.
Pour les grandes matrices (10 ** 5 lignes et plus), il est préférable d'utiliser un matmult vectorisé. Passez dans toutes les rangées et cols en un seul coup. C'est extrêmement rapide. Il n'y a pas de boucle en python ici. Je l'ai initialement conçu pour convertir de nombreuses colonnes binaires comme 0/1 pour 10 colonnes de genre différentes dans MovieLens en un seul entier pour chaque ligne d'exemple.
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