Base-2 ikili sayı dizesini int biçimine dönüştür


306

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ı?


3
Gerçekten önemli olmasa da, bir ikili dize tipik olarak gerçek ikili veriler içeren bir dize anlamına gelir (bir bayt iki onaltılık basamak içerir, yani "\ x00" boş bir bayttır).
trevorKirkby

Yanıtlar:


563

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

İşte python2 ve python3 için belgeler .


61
Birisi tam tersini arıyorsa: bin(255)-> '0b11111111'. Bkz bu cevabı ek ayrıntılar için.
Akseli Palén

7
Bunun sadece imzasız ikili tamsayılar için geçerli olduğuna dikkat edilmelidir. İmzalı tamsayılar için dönüştürme seçenekleri dağınıktır.
Sahte İsim

2
Python 3'te nasıl yapılır?
Saras Arya

2
@SarasArya Çok benzer! :) Güncelledim, yukarıya bakın.
açma

1
Ve etkileşimli bir REPL oturumunda (bilgi >>>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ı
John Y

37

Sadece python interaktif arayüzüne 0b11111111 yazın :

>>> 0b11111111
    255

28

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.


8

İ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))])

4
Bunun yerine tanımlamanın add = lambda x, y: x + y, int.__add__azaltmak için sağlanabilir. Ör.reduce(int.__add__, ...)
Jordan Jambazov

4

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')

3

Özyinelemeli Python uygulaması:

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

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.


0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.