การแปลงจำนวนเต็มเป็นเลขฐานสองในไพ ธ อน


179

เพื่อที่จะแปลงจำนวนเต็มเป็นเลขฐานสองฉันได้ใช้รหัสนี้:

>>> bin(6)  
'0b110'

และเมื่อใดที่จะลบ '0b' ฉันจะใช้สิ่งนี้:

>>> bin(6)[2:]  
'110'

ฉันจะทำอย่างไรถ้าฉันต้องการแสดง6เป็น00000110แทนที่จะเป็น110?


2
เป็นไปได้ที่ซ้ำกันของPython int ไปเป็นไบนารีหรือไม่
Martin Thoma

คำตอบ:


355
>>> '{0:08b}'.format(6)
'00000110'

เพียงอธิบายส่วนต่างๆของสตริงการจัดรูปแบบ:

  • {} วางตัวแปรลงในสตริง
  • 0 รับตัวแปรที่ตำแหน่งอาร์กิวเมนต์ 0
  • :เพิ่มตัวเลือกการจัดรูปแบบสำหรับตัวแปรนี้ (มิฉะนั้นจะเป็นตัวแทนทศนิยม6)
  • 08 จัดรูปแบบตัวเลขแปดหลัก zero-padded ด้านซ้าย
  • b แปลงตัวเลขเป็นการแทนเลขฐานสอง

หากคุณใช้ Python 3.6 หรือสูงกว่าคุณสามารถใช้ f-strings:

>>> f'{6:08b}'
'00000110'

7
ครั้งแรก0หมายถึงอาร์กิวเมนต์0th formatหลังจากเครื่องหมายจุดคู่เป็นการจัดรูปแบบที่สอง0หมายถึงศูนย์เติม 8 ช่องว่างและbสำหรับไบนารี
jamylak

@ Aif: นอกจากนี้ให้ดูที่เอกสารมาตรฐานdocs.python.org/library/…
pepr

19
สิ่งนี้สามารถทำให้ง่ายขึ้นด้วยformat() ฟังก์ชัน : format(6, '08b'); ฟังก์ชั่นใช้ค่า (สิ่งที่{..}ช่องใช้กับ) และข้อกำหนดการจัดรูปแบบ (สิ่งที่คุณจะใส่หลังจาก:ในสตริงการจัดรูปแบบ)
Martijn Pieters

4
'{0:08b}'.format(-6)'-0000110'-> ถ้าคุณไม่ต้องการลงชื่อ struct? -6%256?
n611x007

1
@ AK47 ใช่ตั้งแต่ Pythoon 2.6 คุณสามารถเขียนค่าคงที่ int ในรูปแบบไบนารีด้วย 0b หรือ 0B คำนำหน้า: 0b00000110
Denis Barmenkov

102

แค่ความคิดอื่น:

>>> bin(6)[2:].zfill(8)
'00000110'

วิธีที่สั้นกว่าผ่านการแก้ไขสตริง ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
โปรดทราบว่าการแก้ปัญหานี้คือเร็วกว่าได้รับการยอมรับอย่างใดอย่างหนึ่ง วิธีแก้ปัญหาแบบไหนที่ชัดเจนกว่า (หรือกล้าพูด Pythonic) น่าจะเป็นเรื่องของรสนิยมส่วนตัว
อากาศ

ฉันยังคงเรียนรู้สาระสำคัญของ pythonicity แต่มันชัดเจนยิ่งกว่าหลากหลาย ในตอนแรกฉันรู้สึกตื่นเต้นที่เห็นโซลูชันที่ได้รับการยอมรับพร้อมคำอธิบายที่สวยงาม แต่ก็ตกใจว่าวัตถุที่ถูกเรียกใช้เพื่อทำวิธีนั้นเขียนเป็นสตริงเดี่ยวโดยมีข้อกำหนดทั้งหมดที่มีอยู่ภายในขจัดความเกี่ยวข้องของตัวแปรในสิ่งต่าง ๆ ของ bitstring วิธีนี้แก้ปัญหาได้อย่างสมบูรณ์และใช้งานง่าย (อย่างน้อยสำหรับ Python 2) ซึ่งไม่จำเป็นต้องอธิบายตัวละครแต่ละตัว!
Post169

ไม่ทำงานสำหรับจำนวนเต็มลบbin(-6)[2:].zfill(8)อ่านเป็น'0000b110'
jlandercy

20

วิธีการ twiddling บิต ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
วิธีการที่ดี แต่ฉันไม่เข้าใจว่าส่วนนี้ของโค้ดของคุณทำอะไร: str ((x >> i) & 1)
Gregory

2
@ Gregory: มันเลื่อนบิตxไปทางขวาและ ANDs ด้วย1โดยแยกหนึ่งบิต (0 หรือ 1) ในแต่ละครั้ง
usr2564301

16

เพียงใช้ฟังก์ชั่นการจัดรูปแบบ

format(6, "08b")

รูปแบบทั่วไปคือ

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
ใช่ฉันชอบสิ่งนี้มันเรียบง่ายและเป็นหนึ่งในที่เร็วที่สุด :-) 1000000 loops, best of 3: 556 ns per loop
SebMa

10

คำตอบของ eumiro นั้นดีกว่า แต่ฉันแค่โพสต์สิ่งนี้เพื่อความหลากหลาย:

>>> "%08d" % int(bin(6)[2:])
00000110

3
หึ นี่เป็นความผิดที่ลึกมากฉันต้องลงคะแนนให้ การตีความตัวเลขเป็นทศนิยมคือความฉลาดหลักแหลม แย่ยิ่งกว่า:'%08x' % int(bin(6)[2:], 16)
นักฟิสิกส์บ้า

6

.. หรือหากคุณไม่แน่ใจว่าควรเป็น 8 หลักเสมอคุณสามารถส่งเป็นพารามิเตอร์ได้:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

numpy.binary_repr(num, width=None) มีอาร์กิวเมนต์ความกว้างเวทย์มนตร์

ตัวอย่างที่เกี่ยวข้องจากเอกสารที่ลิงก์ด้านบน:

>>> np.binary_repr(3, width=4)
'0011'

ส่วนประกอบทั้งสองจะถูกส่งกลับเมื่อหมายเลขอินพุตเป็นลบและระบุความกว้าง:

>>> np.binary_repr(-3, width=5)
'11101'

4

การไปโรงเรียนเก่าจะได้ผลเสมอ

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

number=number/2ให้ลอยดังนั้นnumber=number//2ตะเข็บที่ดีกว่าผมก็จะเข้ามาแทนที่number=number//2ด้วยnumber//=2และb=b+"0"ด้วยb+="0"
Brambor

นอกจากนี้คุณไม่มีช่องว่างภายใน 0 ตามที่ OP ต้องการ
Brambor

1
('0' * 7 + bin(6)[2:])[-8:]

หรือ

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

2
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Nic3500

0

สมมติว่าคุณต้องการแยกจำนวนตัวเลขที่ใช้เพื่อแทนค่าจากตัวแปรซึ่งไม่คงที่เสมอไปวิธีที่ดีคือการใช้ numpy.binary

อาจมีประโยชน์เมื่อคุณใช้ไบนารีกับชุดพลังงาน

import numpy as np
np.binary_repr(6, width=8)

0

วิธีที่ดีที่สุดคือการระบุรูปแบบ

format(a, 'b')

ส่งคืนค่าไบนารีของรูปแบบสตริง

ในการแปลงสตริงไบนารีกลับไปเป็นจำนวนเต็มให้ใช้ฟังก์ชัน int ()

int('110', 2)

ส่งคืนค่าจำนวนเต็มของสตริงไบนารี


ควรจัดรูปแบบ (a, '08b') เพื่อให้ได้รูปแบบที่ผู้ใช้ต้องการ
ZSG

0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.