คุณจะแสดงตัวอักษรไบนารีใน Python อย่างไร


351

คุณจะแสดงจำนวนเต็มเป็นเลขฐานสองด้วยตัวอักษร Python ได้อย่างไร

ฉันสามารถค้นหาคำตอบสำหรับ hex ได้อย่างง่ายดาย:

>>> 0x12AF
4783
>>> 0x100
256

และแปด:

>>> 01267
695
>>> 0100
64

คุณใช้ตัวอักษรเพื่อแสดงไบนารีใน Python อย่างไร


สรุปคำตอบ

  • Python 2.5 และรุ่นก่อนหน้า: สามารถแสดงไบนารีโดยใช้int('01010101111',2)แต่ไม่ใช่แบบตัวอักษร
  • Python 2.5 และรุ่นก่อนหน้า: ไม่มีวิธีในการแสดงตัวอักษรไบนารี
  • งูหลาม 2.6 เบต้า: คุณสามารถทำเช่นดังนั้น: หรือ0b11001110B1100111
  • Python 2.6 beta: จะอนุญาต0o27หรือ0O27(อักขระตัวที่สองคือตัวอักษร O) เพื่อแทนค่าฐานแปด
  • Python 3.0 beta: เหมือนกับ 2.6 แต่จะไม่อนุญาตให้ใช้027ไวยากรณ์ที่เก่ากว่าสำหรับ octals อีกต่อไป

คำตอบ:


291

สำหรับการอ้างอิง - ความเป็นไปได้ของ Python ในอนาคต :
เริ่มต้นด้วย Python 2.6 คุณสามารถแสดงตัวอักษรไบนารีโดยใช้คำนำหน้า0bหรือ0B :

>>> 0b101111
47

นอกจากนี้คุณยังสามารถใช้ฟังก์ชันbinใหม่เพื่อรับการแทนเลขฐานสองของตัวเลข:

>>> bin(173)
'0b10101101'

เอกสารประกอบการพัฒนาเวอร์ชัน: มีอะไรใหม่ใน Python 2.6


72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

อีกวิธีหนึ่ง


2
สิ่งนี้น่าสนใจสำหรับเมื่อคุณมีสตริง แต่หากทำงานกับตัวเลขจริงคุณจะต้องเพิ่มการคำนวณที่ไม่จำเป็นในโค้ด
Daniel Möller

28

คุณจะแสดงตัวอักษรไบนารีใน Python อย่างไร

พวกเขาไม่ใช่ตัวอักษร "ไบนารี" แต่เป็น "ตัวอักษรจำนวนเต็ม" คุณสามารถแสดงตัวอักษรจำนวนเต็มด้วยรูปแบบไบนารี0ตามด้วยBหรือbตามด้วยชุดของศูนย์และคนเช่น:

>>> 0b0010101010
170
>>> 0B010101
21

จาก Python 3 docsนี่เป็นวิธีการจัดหาตัวอักษรจำนวนเต็มใน Python:

จำนวนเต็มตามตัวอักษรอธิบายด้วยคำศัพท์ต่อไปนี้:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+
octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+
hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::=  "1"..."9"
digit        ::=  "0"..."9"
bindigit     ::=  "0" | "1"
octdigit     ::=  "0"..."7"
hexdigit     ::=  digit | "a"..."f" | "A"..."F"

ไม่มีขีด จำกัด สำหรับความยาวของตัวอักษรจำนวนเต็มนอกเหนือจากสิ่งที่สามารถเก็บไว้ในหน่วยความจำที่มีอยู่

โปรดทราบว่าไม่อนุญาตให้นำศูนย์ในจำนวนทศนิยมที่ไม่ใช่ศูนย์ นี่คือการแก้ความกำกวมด้วยตัวอักษรฐานแปดแบบ C ซึ่ง Python ใช้ก่อนหน้าเวอร์ชัน 3.0

ตัวอย่างบางส่วนของตัวอักษรจำนวนเต็ม:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

เปลี่ยนเป็นเวอร์ชั่น 3.6:ตอนนี้ได้รับอนุญาตขีดล่างเพื่อจุดประสงค์ในการจัดกลุ่มเป็นตัวอักษร

วิธีอื่นในการแสดงไบนารี:

คุณสามารถมีค่าศูนย์และคนในวัตถุสตริงที่สามารถจัดการ (แม้ว่าคุณควรจะดำเนินการ bitwise ในจำนวนเต็มในกรณีส่วนใหญ่) - เพียงแค่ผ่านสตริงของศูนย์และคนและฐานที่คุณกำลังแปลงจาก (2 ):

>>> int('010101', 2)
21

คุณสามารถเลือกที่จะมีคำนำหน้า0bหรือ0B:

>>> int('0b0010101010', 2)
170

ถ้าคุณผ่านมัน0เป็นฐานมันจะถือว่าฐาน 10 หากสตริงไม่ได้ระบุด้วยคำนำหน้า:

>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21

การแปลงจาก int กลับเป็นไบนารีที่มนุษย์สามารถอ่านได้:

คุณสามารถส่งจำนวนเต็มไปยังถังขยะเพื่อดูการแทนค่าสตริงของตัวอักษรไบนารี:

>>> bin(21)
'0b10101'

และคุณสามารถรวมbinและintไปกลับ:

>>> bin(int('010101', 2))
'0b10101'

คุณสามารถใช้ข้อกำหนดคุณสมบัติการจัดรูปแบบได้เช่นกันหากคุณต้องการมีความกว้างขั้นต่ำด้วยเลขศูนย์หน้า:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'

2

0 ในจุดเริ่มต้นที่นี่ระบุว่าฐานคือ 8 (ไม่ใช่ 10) ซึ่งง่ายต่อการดู:

>>> int('010101', 0)
4161

หากคุณไม่ได้เริ่มต้นด้วย 0 ดังนั้นหลามจะถือว่าตัวเลขนั้นเป็นฐาน 10

>>> int('10101', 0)
10101

-1

เท่าที่ฉันสามารถบอก Python ได้ถึง 2.5 จะรองรับเฉพาะเลขฐานสิบหกและตัวอักษรฐานแปด ฉันพบการสนทนาบางอย่างเกี่ยวกับการเพิ่มไบนารีลงในรุ่นอนาคต แต่ไม่มีอะไรแน่นอน


-3

ฉันค่อนข้างแน่ใจว่านี่เป็นหนึ่งในสิ่งที่เกิดขึ้นเนื่องจากการเปลี่ยนแปลงใน Python 3.0 ด้วยบางที bin () เพื่อไปด้วย hex () และ oct ()

แก้ไข: คำตอบของ lbrandy ถูกต้องในทุกกรณี

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