Làm thế nào để bạn thể hiện bằng chữ nhị phân trong Python?


351

Làm thế nào để bạn thể hiện một số nguyên dưới dạng số nhị phân với chữ Python?

Tôi dễ dàng có thể tìm thấy câu trả lời cho hex:

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

và bát phân:

>>> 01267
695
>>> 0100
64

Làm thế nào để bạn sử dụng chữ để thể hiện nhị phân trong Python?


Tóm tắt câu trả lời

  • Python 2.5 trở về trước: có thể diễn đạt nhị phân bằng cách sử dụng int('01010101111',2)nhưng không bằng chữ.
  • Python 2.5 trở về trước: không có cách nào để diễn đạt bằng chữ nhị phân.
  • Python 2.6 beta: Bạn có thể làm như vậy: 0b1100111hoặc 0B1100111.
  • Python 2.6 beta: cũng sẽ cho phép 0o27hoặc 0O27(ký tự thứ hai là chữ O) đại diện cho một bát phân.
  • Python 3.0 beta: Tương tự 2.6, nhưng sẽ không còn cho phép 027cú pháp cũ hơn cho các quãng tám.

Câu trả lời:


291

Để tham khảo các khả năng Python trong tương lai của Python:
Bắt đầu với Python 2.6, bạn có thể diễn đạt bằng chữ nhị phân bằng cách sử dụng tiền tố 0b hoặc 0B :

>>> 0b101111
47

Bạn cũng có thể sử dụng hàm bin mới để có được biểu diễn nhị phân của một số:

>>> bin(173)
'0b10101101'

Phiên bản phát triển của tài liệu: Có gì mới trong Python 2.6


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

Cách khác.


2
Điều này rất thú vị khi bạn có các chuỗi, nhưng nếu làm việc với các số thuần túy, bạn thêm các tính toán không cần thiết vào mã.
Daniel Möller

28

Làm thế nào để bạn thể hiện bằng chữ nhị phân trong Python?

Chúng không phải là "nhị phân", mà là "số nguyên". Bạn có thể biểu thị chữ nguyên với định dạng nhị phân 0theo sau là a Bhoặc btheo sau là một loạt các số không và số không, ví dụ:

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

Từ tài liệu Python 3 , đây là những cách cung cấp chữ nguyên trong Python:

Chữ nguyên được mô tả bởi các định nghĩa từ vựng sau đây:

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"

Không có giới hạn về độ dài của số nguyên bằng chữ ngoài những gì có thể được lưu trữ trong bộ nhớ khả dụng.

Lưu ý rằng các số 0 đứng đầu trong số thập phân khác không được phép. Điều này là để định hướng với các chữ bát phân kiểu C, mà Python đã sử dụng trước phiên bản 3.0.

Một số ví dụ về chữ nguyên:

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

Thay đổi trong phiên bản 3.6: Dấu gạch dưới hiện được phép cho các mục đích nhóm theo nghĩa đen.

Các cách khác để thể hiện nhị phân:

Bạn có thể có các số 0 và số một trong một đối tượng chuỗi có thể được thao tác (mặc dù bạn có thể chỉ cần thực hiện các thao tác bit trên số nguyên trong hầu hết các trường hợp) - chỉ cần chuyển int chuỗi số 0 và số cơ sở và cơ sở bạn đang chuyển đổi từ (2 ):

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

Bạn có thể tùy chọn có tiền tố 0bhoặc 0B:

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

Nếu bạn vượt qua nó 0làm cơ sở, nó sẽ giả sử cơ sở 10 nếu chuỗi không chỉ định với tiền tố:

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

Chuyển đổi từ int trở lại nhị phân có thể đọc được của con người:

Bạn có thể chuyển một số nguyên cho bin để xem biểu diễn chuỗi của một chữ nhị phân:

>>> bin(21)
'0b10101'

Và bạn có thể kết hợp binintquay trở lại:

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

Bạn cũng có thể sử dụng một đặc tả định dạng, nếu bạn muốn có chiều rộng tối thiểu với các số 0 trước:

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

2

0 bắt đầu ở đây chỉ định rằng cơ sở là 8 (không phải 10), điều này khá dễ thấy:

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

Nếu bạn không bắt đầu bằng 0, thì python giả định số đó là cơ sở 10.

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

-1

Theo như tôi có thể nói với Python, lên tới 2,5, chỉ hỗ trợ các chữ thập lục phân & bát phân. Tôi đã tìm thấy một số cuộc thảo luận về việc thêm nhị phân vào các phiên bản trong tương lai nhưng không có gì rõ ràng.


-3

Tôi khá chắc chắn rằng đây là một trong những điều do thay đổi trong Python 3.0 với có lẽ bin () đi với hex () và oct ().

EDIT: câu trả lời của lbrandy là đúng trong mọi trường hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.