แปลงสตริงเลขฐานสองฐาน 2 เป็น int


306

ฉันแค่อยากจะแปลงสตริงเลขฐานสองฐาน 2 เป็น int บางอย่างเช่นนี้:

>>> '11111111'.fromBinaryToInt()
255

มีวิธีการทำเช่นนี้ใน Python หรือไม่?


3
แม้ว่ามันจะไม่สำคัญ แต่โดยทั่วไปสตริงไบนารี่จะหมายถึงสตริงที่มีข้อมูลไบนารีจริง
trevorKirkby

คำตอบ:


563

คุณใช้intฟังก์ชันในตัวและส่งผ่านฐานของหมายเลขอินพุตเช่น2สำหรับเลขฐานสอง:

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

นี่คือเอกสารpython2และสำหรับpython3


61
ในกรณีที่มีคนที่กำลังมองหาตรงข้าม: ->bin(255) '0b11111111'ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
Akseli Palén

7
ควรสังเกตว่าสิ่งนี้ใช้ได้กับเลขจำนวนเต็มไบนารีที่ไม่ได้ลงนามเท่านั้น สำหรับจำนวนเต็มที่ลงนามแล้วตัวเลือกการแปลงจะไม่เป็นระเบียบ
ชื่อปลอม

2
วิธีการทำเช่นนี้ในหลาม 3?
Saras Arya

2
@SarasArya มันคล้ายกันมาก! :) ฉันปรับปรุงดูด้านบน
คลาย

1
และโปรดทราบว่าในเซสชัน REPL เชิงโต้ตอบ (ตามที่ได้รับการแนะนำจาก>>>พรอมต์) คุณไม่จำเป็นต้องใช้printเลย ตัวอย่างสมมุติของ OP ไม่ได้ ดังนั้นมันควรจะเหมือนกันใน Python 2 และ 3
John Y


28

อีกวิธีในการทำเช่นนี้คือการใช้bitstringโมดูล:

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

โปรดทราบว่าจำนวนเต็มที่ไม่ได้ลงนามนั้นแตกต่างจากจำนวนเต็มที่ลงนาม:

>>> b.int
-1

bitstringโมดูลไม่จำเป็นต้อง แต่ก็มีจำนวนมากวิธี performant สำหรับการเปิดการป้อนข้อมูลเข้าและออกจากบิตในรูปแบบอื่น ๆ เช่นเดียวกับการจัดการกับพวกเขา


8

การใช้ int with base เป็นวิธีที่ถูกต้อง ฉันเคยทำสิ่งนี้ก่อนที่ฉันจะพบว่า int ใช้ฐานเช่นกัน มันเป็นพื้นลดนำไปใช้กับรายการความเข้าใจของวิธีดั้งเดิมของการแปลงไบนารีเป็นทศนิยม (เช่น 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
แทนการกำหนดadd = lambda x, y: x + y, int.__add__สามารถให้บริการเพื่อลด ตัวอย่างreduce(int.__add__, ...)
Jordan Jambazov

4

หากคุณอยากรู้ว่าเกิดอะไรขึ้นเบื้องหลังคุณก็ไปที่นี่แล้ว

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


1

หากคุณใช้ python3.6 หรือใหม่กว่าคุณสามารถใช้ f-string เพื่อทำการแปลง:

ไบนารีถึงทศนิยม:

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

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

เลขฐานสองถึงเลขฐานแปดฐานแปดและอื่น ๆ

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

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

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

ให้ความสนใจกับข้อมูล 2 ชิ้นคั่นด้วยเครื่องหมายจุดคู่

ด้วยวิธีนี้คุณสามารถแปลงระหว่าง {binary, octal, hexadecimal, decimal} เป็น {binary, octal, hexadecimal, decimal} โดยการเปลี่ยนด้านขวาของเครื่องหมายโคลอน [:]

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

ลองเปลี่ยนด้านซ้ายของโคลอนเพื่อให้มีฐานแปด / ฐานสิบหก / ทศนิยม


0

สำหรับเมทริกซ์ขนาดใหญ่ (10 ** 5 แถวขึ้นไป) จะดีกว่าถ้าใช้ matmult แบบเวกเตอร์ ผ่านทุกแถวและ cols ในนัดเดียว มันเร็วมาก ไม่มีการวนลูปในไพ ธ อน ตอนแรกฉันออกแบบมันเพื่อแปลงคอลัมน์ไบนารีจำนวนมากเช่น 0/1 สำหรับคอลัมน์ 10 ประเภทที่แตกต่างกันใน MovieLens ให้เป็นจำนวนเต็มเดียวสำหรับแต่ละแถวตัวอย่าง

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.