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?
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?
Jawaban:
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 .
bin(255)-> '0b11111111'. Lihat jawaban ini untuk detail tambahan.
>>>prompt), Anda tidak perlu menggunakan printsama sekali. Contoh hipotesis OP tidak. Jadi itu harus benar-benar identik dengan Python 2 dan 3.
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.
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))])
add = lambda x, y: x + y, int.__add__bisa diberikan pengurangan. Misalnyareduce(int.__add__, ...)
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')
Implementasi Python rekursif:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [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.
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