ฉันพยายามแปลงจำนวนเต็มเป็นไบนารีโดยใช้ฟังก์ชัน bin () ใน Python อย่างไรก็ตามมันจะลบค่าศูนย์นำหน้าซึ่งฉันต้องการจริง ๆ เสมอดังนั้นผลลัพธ์จะเป็น 8 บิตเสมอ:
ตัวอย่าง:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
มีวิธีทำเช่นนี้หรือไม่?
ฉันพยายามแปลงจำนวนเต็มเป็นไบนารีโดยใช้ฟังก์ชัน bin () ใน Python อย่างไรก็ตามมันจะลบค่าศูนย์นำหน้าซึ่งฉันต้องการจริง ๆ เสมอดังนั้นผลลัพธ์จะเป็น 8 บิตเสมอ:
ตัวอย่าง:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
มีวิธีทำเช่นนี้หรือไม่?
คำตอบ:
ใช้format()
ฟังก์ชั่น :
>>> format(14, '#010b')
'0b00001110'
format()
ฟังก์ชั่นเพียงแค่รูปแบบการป้อนข้อมูลต่อไปนี้รูปแบบจำเพาะมินิภาษา #
ทำให้รูปแบบรวมถึง0b
คำนำหน้าและ010
ขนาดรูปแบบการส่งออกให้พอดีกับความกว้าง 10 ตัวอักษรที่มี0
ช่องว่างภายใน; 2 ตัวอักษรสำหรับ0b
คำนำหน้าส่วนอีก 8 ตัวสำหรับเลขฐานสอง
นี่คือตัวเลือกที่กะทัดรัดและตรงที่สุด
หากคุณใส่ผลลัพธ์ในสตริงที่มีขนาดใหญ่ขึ้นให้ใช้สตริงที่จัดรูปแบบตามตัวอักษร (3.6+) หรือใช้str.format()
และใส่อาร์กิวเมนต์ที่สองสำหรับformat()
ฟังก์ชันหลังเครื่องหมายโคลอนของตัวยึดตำแหน่ง{:..}
:
>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'
ตามที่เกิดขึ้นแม้เพียงแค่จัดรูปแบบค่าเดียว (ดังนั้นโดยไม่ต้องใส่ผลลัพธ์ในสตริงที่มีขนาดใหญ่กว่า) การใช้สตริงตัวอักษรที่จัดรูปแบบจะเร็วกว่าการใช้format()
:
>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format") # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193
แต่ฉันจะใช้มันเฉพาะในกรณีที่การแสดงในวงแคบเป็นเรื่องที่ควรformat(...)
สื่อสาร
หากคุณไม่ต้องการ0b
คำนำหน้าให้ปล่อย#
และปรับความยาวของฟิลด์:
>>> format(14, '08b')
'00001110'
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
และใส่อาร์กิวเมนต์ที่สองสำหรับฟังก์ชั่น format () หลังเครื่องหมายโคลอนของตัวยึดตำแหน่ง{:..}
:
f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
เช่นการใช้งาน
>>> '{:08b}'.format(1)
'00000001'
โปรดดู: ข้อกำหนดคุณสมบัติรูปแบบมินิภาษา
หมายเหตุสำหรับ Python 2.6 หรือเก่ากว่าคุณไม่สามารถละเว้นตัวระบุอาร์กิวเมนต์ตำแหน่งได้:
ดังนั้นควรใช้
>>> '{0:08b}'.format(1)
'00000001'
str.format()
ที่นี่เมื่อformat()
จะทำ คุณไม่มี0b
คำนำหน้า
str.format
มีความยืดหยุ่นมากกว่าformat()
เพราะจะช่วยให้คุณทำหลายตัวแปรพร้อมกัน ฉันลืมไปตลอดว่าformat
ฟังก์ชั่นยังมีอยู่ เป็นที่ยอมรับกันอย่างสมบูรณ์ว่าเพียงพอในกรณีนี้
str.format()
มีเพียงหนึ่ง{}
องค์ประกอบที่ไม่มีข้อความอื่น ๆ คุณจะไม่ได้ใช้สตริง templating คุณจะจัดรูปแบบหนึ่งค่า format()
ในกรณีใช้เพียง :-)
ฉันใช้
bin(1)[2:].zfill(8)
จะพิมพ์
'00000001'
คุณสามารถใช้การจัดรูปแบบสตริงมินิภาษา:
def binary(num, pre='0b', length=8, spacer=0):
return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])
การสาธิต:
print binary(1)
เอาท์พุท:
'0b00000001'
แก้ไข: อิงตามแนวคิด @Martijn Pieters
def binary(num, length=8):
return format(num, '#0{}b'.format(length + 2))
#
ใช้ นอกจากนี้ยังมีformat()
ซึ่งช่วยให้คุณไม่ต้องทำแม่แบบสตริงเต็ม
เมื่อใช้ Python >= 3.6
วิธีที่สะอาดที่สุดคือใช้f-stringsพร้อมการจัดรูปแบบสตริง :
>>> var = 23
>>> f"{var:#010b}"
'0b00010111'
คำอธิบาย:
var
ตัวแปรที่จะจัดรูปแบบ:
ทุกอย่างหลังจากนี้เป็นตัวระบุรูปแบบ#
ใช้แบบฟอร์มทางเลือก (เพิ่ม0b
คำนำหน้า)0
แผ่นกับศูนย์10
แผ่นความยาวรวมออก 10 (รวมถึง 2 ตัวอักษรสำหรับ0b
)b
ใช้การเป็นตัวแทนไบนารีสำหรับจำนวนformat(var, "#010b")
สื่อสารเจตนาดีกว่ามาก มันเป็นตัวเลือกที่เร็วที่สุด แต่คุณก็รู้แล้วว่าถูกต้องเพราะฉันครอบคลุมทุกสิ่งที่คุณโพสต์ไว้ในคำตอบ
บางครั้งคุณแค่ต้องการซับง่าย ๆ :
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
Python 3
[ ]
ไม่จำเป็นต้องมี - join()
ยอมรับนิพจน์ตัวสร้าง ''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
ต้องทำการผ่านสองครั้งเครื่องกำเนิดสัญญาณจะถูกแปลงเป็นรายการแรกก่อนเข้าร่วม สิ่งนี้ต้องใช้เวลาอย่างมากในการทำงานและทำดีกว่าที่นี่จริง ๆเพื่อส่งผ่านรายการความเข้าใจมากกว่านิพจน์ตัวสร้าง มันเป็นสิ่งหนึ่งถ้าพวกเขายกเว้นกฎ
คุณสามารถใช้สิ่งนี้
("{:0%db}"%length).format(num)
"{:0{l}b}".format(num, l=length)
คุณสามารถใช้วิธีการสตริง rjust ของไวยากรณ์หลาม: string.rjust (ความยาว, fillchar) fillchar เป็นตัวเลือก
และสำหรับคำถามของคุณคุณเขียนเช่นนี้
'0b'+ '1'.rjust(8,'0)
ดังนั้นมันจะเป็น '0b00000001'
int
แทนแบบไบนารีที่เป็นข้อความ int
คุณไม่ได้เริ่มต้นด้วย
คุณสามารถใช้ zfill:
print str(1).zfill(2)
print str(10).zfill(2)
print str(100).zfill(2)
พิมพ์:
01
10
100
ฉันชอบโซลูชันนี้เนื่องจากช่วยได้ไม่เพียง แต่เมื่อแสดงผลตัวเลข แต่เมื่อคุณจำเป็นต้องกำหนดให้กับตัวแปร ... เช่น - x = str (datetime.date.today (). เดือน) .zfill (2) จะ ส่งคืน x เป็น '02' สำหรับเดือน feb
bin(14)
ให้ '0b1110' 'และ bin(14).zfill(8)
ให้' 000b1110 '' ไม่ใช่ `'0b00001110' 'ซึ่งเป็นสิ่งที่ต้องการ