Ben sadece bir int bir base-2 ikili sayı dizesini dönüştürmek istiyorum, böyle bir şey:
>>> '11111111'.fromBinaryToInt()
255
Python'da bunu yapmanın bir yolu var mı?
Ben sadece bir int bir base-2 ikili sayı dizesini dönüştürmek istiyorum, böyle bir şey:
>>> '11111111'.fromBinaryToInt()
255
Python'da bunu yapmanın bir yolu var mı?
Yanıtlar:
Yerleşik intişlevi kullanırsınız ve giriş numarasının tabanını, yani 2bir ikili sayı için iletirsiniz :
>>> int('11111111', 2)
255
>>>isteminin önerdiği gibi ), hiç kullanmanıza gerek olmadığını unutmayın print. OP'nin varsayımsal örneği yoktu. Bu yüzden Python 2 ve 3'te gerçekten aynı olmalı
Bunu yapmanın başka bir yolu da bitstringmodülü kullanmaktır :
>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
İmzasız tamsayı işaretli tamsayıdan farklıdır:
>>> b.int
-1
bitstringModül bir gereklilik değildir, ancak diğer formlara içine ve bit girdi dönüm yanı sıra işlemkete performant çok metod vardır.
İnt'i base ile kullanmak doğru yol. İnt de üs bulmadan önce bunu yapardım. Temelde, ikiliyi ondalığa dönüştürmenin ilkel yolunun bir liste kavrayışında uygulanan bir azalmadır (örneğin 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__azaltmak için sağlanabilir. Ör.reduce(int.__add__, ...)
Sahnenin arkasında neler olduğunu bilmek istiyorsanız, işte gidiyorsunuz.
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')
Özyinelemeli Python uygulaması:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [1]
Python3.6 veya üstünü kullanıyorsanız, dönüştürme işlemini yapmak için f-string'i kullanabilirsiniz:
İkiliden onluya:
>>> print(f'{0b1011010:#0}')
90
>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90
ikili ila sekizli altıgen vb.
>>> f'{0b1011010:#o}'
'0o132' # octal
>>> f'{0b1011010:#x}'
'0x5a' # hexadecimal
>>> f'{0b1011010:#0}'
'90' # decimal
İki nokta üst üste işareti ile ayrılmış bilgilere dikkat edin.
Bu şekilde, kolonun sağ tarafını değiştirerek {ikili, sekizli, onaltılık, ondalık} değerini {ikili, sekizli, onaltılı, ondalık} arasında dönüştürebilirsiniz [:]
:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal
:#0 -> converts to decimal as above example
Sekizli / onaltılık / ondalık olacak şekilde kolonun sol tarafını değiştirmeyi deneyin.
Büyük matris (10 ** 5 sıra ve üstü) için vektörize edilmiş bir matmult kullanmak daha iyidir. Tüm satırları ve sütunları tek seferde geçirin. Son derece hızlı. Burada python'da döngü yok. Başlangıçta MovieLens gibi 10 farklı tür sütun için 0/1 gibi birçok ikili sütunu her örnek satır için tek bir tamsayıya dönüştürmek için tasarladım.
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