Bagaimana Anda mengekspresikan literal biner dengan Python?

351

Bagaimana Anda mengekspresikan integer sebagai angka biner dengan literal Python?

Saya dengan mudah dapat menemukan jawaban untuk hex:

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

dan oktal:

>>> 01267
695
>>> 0100
64

Bagaimana Anda menggunakan literal untuk mengekspresikan biner dengan Python?


Ringkasan Jawaban

  • Python 2.5 dan sebelumnya: dapat mengekspresikan penggunaan biner int('01010101111',2)tetapi tidak dengan literal.
  • Python 2.5 dan sebelumnya: tidak ada cara untuk mengekspresikan literal biner.
  • Python 2.6 beta: Anda dapat melakukannya seperti: 0b1100111atau 0B1100111.
  • Python 2.6 beta: juga akan mengizinkan 0o27atau 0O27(karakter kedua adalah huruf O) untuk mewakili oktal.
  • Python 3.0 beta: Sama seperti 2.6, tetapi tidak akan lagi mengijinkan 027sintaks yang lebih lama untuk oktal.
Justin Standard
sumber

Jawaban:

291

Untuk referensi— kemungkinan Python di masa mendatang :
Dimulai dengan Python 2.6 Anda dapat mengekspresikan literal biner menggunakan awalan 0b atau 0B :

>>> 0b101111
47

Anda juga dapat menggunakan fungsi bin baru untuk mendapatkan representasi biner dari sebuah angka:

>>> bin(173)
'0b10101101'

Versi pengembangan dokumentasi: Apa yang Baru di Python 2.6

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

Cara lain.

Louis Brandy
sumber
2
Ini menarik ketika Anda memiliki string, tetapi jika bekerja dengan angka murni, Anda menambahkan perhitungan yang tidak perlu ke kode.
Daniel Möller
28

Bagaimana Anda mengekspresikan literal biner dengan Python?

Mereka bukan "biner" literal, melainkan "integer literals". Anda bisa mengekspresikan bilangan bulat integer dengan format biner dengan 0diikuti oleh Batau bdiikuti oleh serangkaian nol dan yang, misalnya:

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

Dari Python 3 docs , ini adalah cara untuk menyediakan bilangan bulat integer dalam Python:

Literal integer dijelaskan oleh definisi leksikal berikut:

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"

Tidak ada batasan untuk panjang bilangan bulat integer selain dari apa yang dapat disimpan dalam memori yang tersedia.

Perhatikan bahwa angka nol di depan dalam angka desimal bukan nol tidak diperbolehkan. Ini untuk disambiguasi dengan literal oktal gaya-C, yang digunakan Python sebelum versi 3.0.

Beberapa contoh literal bilangan bulat:

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

Berubah dalam versi 3.6: Garis bawah sekarang diizinkan untuk tujuan pengelompokan dalam literal.

Cara lain untuk mengekspresikan biner:

Anda dapat memiliki nol dan satu dalam objek string yang dapat dimanipulasi (walaupun Anda mungkin harus melakukan operasi bitwise pada integer dalam banyak kasus) - cukup masukkan int string nol dan satu dan basis Anda mengkonversi dari (2 ):

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

Anda dapat memiliki 0batau 0Bawalan:

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

Jika Anda meneruskannya 0sebagai basis, ia akan menganggap basis 10 jika string tidak menentukan dengan awalan:

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

Mengubah dari int kembali ke biner yang dapat dibaca manusia:

Anda bisa meneruskan integer ke bin untuk melihat representasi string dari literal biner:

>>> bin(21)
'0b10101'

Dan Anda dapat menggabungkan bindan intuntuk bolak-balik:

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

Anda dapat menggunakan spesifikasi format juga, jika Anda ingin memiliki lebar minimum dengan nol sebelumnya:

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

0 pada awal di sini menetapkan bahwa basisnya adalah 8 (bukan 10), yang cukup mudah dilihat:

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

Jika Anda tidak memulai dengan 0, maka python mengasumsikan angkanya adalah basis 10.

>>> int('10101', 0)
10101
Mehmet Ugurbil
sumber
-1

Sejauh yang saya tahu Python, hingga 2.5, hanya mendukung heksadesimal & oktal literal. Saya memang menemukan beberapa diskusi tentang menambahkan biner ke versi masa depan tetapi tidak ada yang pasti.

Mark Biek
sumber
-3

Saya cukup yakin ini adalah salah satu hal karena perubahan pada Python 3.0 dengan mungkin bin () untuk pergi dengan hex () dan oct ().

EDIT: jawaban lbrandy benar dalam semua kasus.

percikan
sumber