Ubah string nomor biner basis-2 menjadi int

306

Saya hanya ingin mengubah string nomor biner basis-2 menjadi int, sesuatu seperti ini:

>>> '11111111'.fromBinaryToInt()
255

Apakah ada cara untuk melakukan ini dengan Python?

Naftuli Kay
sumber
3
Meskipun tidak terlalu penting, string biner biasanya berarti string yang berisi data biner aktual (satu byte berisi dua digit heksadesimal, yaitu "\ x00" adalah byte nol).
trevorKirkby

Jawaban:

563

Anda menggunakan intfungsi bawaan, dan memberikannya basis nomor input, yaitu 2untuk nomor biner:

>>> int('11111111', 2)
255

Berikut adalah dokumentasi untuk python2 , dan untuk python3 .

beristirahat
sumber
61
Jika seseorang mencari yang sebaliknya: bin(255)-> '0b11111111'. Lihat jawaban ini untuk detail tambahan.
Akseli Palén
7
Perlu dicatat bahwa ini hanya berfungsi untuk bilangan bulat biner yang tidak ditandatangani. Untuk bilangan bulat yang ditandatangani, opsi konversi berantakan.
Nama Palsu
2
Bagaimana cara melakukannya di python 3?
Saras Arya
2
@SarasArya Sangat mirip! :) Saya memperbarui, lihat di atas.
bersantai
1
Dan perhatikan bahwa dalam sesi REPL interaktif (seperti yang disarankan oleh >>>prompt), Anda tidak perlu menggunakan printsama sekali. Contoh hipotesis OP tidak. Jadi itu harus benar-benar identik dengan Python 2 dan 3.
John Y
37

Ketikkan 0b11111111 di antarmuka interaktif python:

>>> 0b11111111
    255
lengxuehx
sumber
28

Cara lain untuk melakukan ini adalah dengan menggunakan bitstringmodul:

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255

Perhatikan bahwa bilangan bulat yang tidak ditandatangani berbeda dari bilangan bulat yang ditandatangani:

>>> b.int
-1

The bitstringModul bukan keharusan, tetapi memiliki banyak metode performant untuk mengubah masukan ke dan dari bit menjadi bentuk lain, serta memanipulasi mereka.

Alex Reynolds
sumber
8

Menggunakan int dengan basis adalah cara yang tepat untuk pergi. Saya dulu melakukan ini sebelum saya menemukan int juga mengambil basis. Ini pada dasarnya adalah pengurangan yang diterapkan pada pemahaman daftar tentang cara primitif mengubah biner menjadi desimal (mis. 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))])
Saurabh Hirani
sumber
4
Alih-alih mendefinisikan add = lambda x, y: x + y, int.__add__bisa diberikan pengurangan. Misalnyareduce(int.__add__, ...)
Jordan Jambazov
4

Jika Anda ingin tahu apa yang terjadi di belakang layar, maka ini dia.

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')
Mohammad Mahjoub
sumber
3

Implementasi Python rekursif:

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

Jika Anda menggunakan python3.6 atau yang lebih baru, Anda dapat menggunakan f-string untuk melakukan konversi:

Biner ke desimal:

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

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

biner ke oktal hexa dan lain-lain

>>> f'{0b1011010:#o}'
'0o132'  # octal

>>> f'{0b1011010:#x}'
'0x5a'   # hexadecimal

>>> f'{0b1011010:#0}'
'90'     # decimal

Perhatikan 2 bagian informasi yang dipisahkan oleh titik dua.

Dengan cara ini, Anda dapat mengonversi antara {binary, octal, hexadecimal, desimal} menjadi {binary, octal, hexadecimal, desimal} dengan mengubah sisi kanan kolon [:]

:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal 
:#0 -> converts to decimal as above example

Coba ubah sisi kiri kolon menjadi oktal / heksadesimal / desimal.

Robert Ranjan
sumber
0

Untuk matriks besar (10 ** 5 baris ke atas) lebih baik menggunakan matmult vektor. Lewati semua baris dan cols dalam satu tembakan. Ini sangat cepat. Tidak ada perulangan di python di sini. Saya awalnya mendesainnya untuk mengubah banyak kolom biner seperti 0/1 untuk seperti 10 kolom genre yang berbeda di MovieLens menjadi satu integer untuk setiap baris contoh.

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
Geoffrey Anderson
sumber