Saya mencoba untuk mengkonversi integer ke biner menggunakan fungsi bin () dengan Python. Namun, itu selalu menghilangkan nol terkemuka, yang sebenarnya saya butuhkan, sehingga hasilnya selalu 8-bit:
Contoh:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Apakah ada cara untuk melakukan ini?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
sumber
sumber
Jawaban:
Gunakan
format()
fungsinya :The
format()
Fungsi hanya format input mengikuti Format bahasa Keterangan Mini . The#
membuat format termasuk0b
awalan, dan010
ukuran format output untuk cocok 10 karakter lebar, dengan0
bantalan; 2 karakter untuk0b
awalan, 8 lainnya untuk digit biner.Ini adalah opsi paling ringkas dan langsung.
Jika Anda meletakkan hasilnya dalam string yang lebih besar, gunakan string string yang diformat (3,6+) atau gunakan
str.format()
dan letakkan argumen kedua untukformat()
fungsi setelah titik dua dari placeholder{:..}
:Seperti yang terjadi, bahkan untuk hanya memformat nilai tunggal (jadi tanpa meletakkan hasilnya dalam string yang lebih besar), menggunakan string literal yang diformat lebih cepat daripada menggunakan
format()
:Tapi saya akan menggunakannya hanya jika kinerja dalam loop ketat penting, karena
format(...)
mengkomunikasikan maksud lebih baik.Jika Anda tidak ingin
0b
awalan, cukup jatuhkan#
dan sesuaikan panjang bidang:sumber
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
dan letakkan argumen kedua untuk fungsi format () setelah tanda titik dua{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
. gunakan .Lihat: Format Spesifikasi Mini-Bahasa
Catatan untuk Python 2.6 atau lebih lama, Anda tidak bisa menghilangkan pengidentifikasi argumen posisi sebelumnya
:
, jadi gunakansumber
str.format()
sini kapanformat()
akan dilakukan. Anda tidak memiliki0b
awalan.str.format
lebih fleksibel daripadaformat()
karena itu akan memungkinkan Anda untuk melakukan beberapa variabel sekaligus. Saya terus lupa bahwaformat
fungsinya bahkan ada. Memang ini sangat memadai dalam hal ini.str.format()
dengan satu{}
elemen, tidak ada teks lain, Anda tidak menggunakan string templating, Anda memformat satu nilai . Dalam hal ini gunakan sajaformat()
. :-)saya menggunakan
akan dicetak
sumber
Anda dapat menggunakan bahasa mini pemformatan string:
Demo:
Keluaran:
EDIT: berdasarkan ide @Martijn Pieters
sumber
#
. Ada jugaformat()
, yang menghemat Anda harus melakukan template string penuh.Saat menggunakan Python
>= 3.6
, cara terbersih adalah menggunakan f-string dengan pemformatan string :Penjelasan:
var
variabel ke format:
semuanya setelah ini adalah penentu format#
gunakan formulir alternatif (tambahkan0b
awalan)0
pad dengan nol10
pad untuk total panjang 10 (ini termasuk 2 karakter untuk0b
)b
gunakan representasi biner untuk nomor tersebutsumber
format(var, "#010b")
berkomunikasi maksud jauh lebih baik. Namun, ini adalah opsi tercepat. Tapi Anda sudah tahu itu, benar, karena saya sudah membahas semua yang Anda posting dalam jawaban saya.Terkadang Anda hanya ingin satu liner sederhana:
Python 3
sumber
[ ]
seharusnya tidak diperlukan -join()
menerima ekspresi generator.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
perlu membuat dua lintasan, input generator pertama dikonversi ke daftar sebelum bergabung. Ini membutuhkan sedikit pengorbanan pada kinerja dan melakukannya sebenarnya lebih baik di sini untuk lulus dalam pemahaman daftar daripada ekspresi generator. Itu satu jika mereka pengecualian terhadap aturan.Anda dapat menggunakan sesuatu seperti ini
sumber
"{:0{l}b}".format(num, l=length)
Anda dapat menggunakan metode string rjust dari sintaks python: string.rjust (length, fillchar) fillchar adalah opsional
dan untuk Pertanyaan Anda, Anda dapat menulis seperti ini
jadi itu akan menjadi '0b00000001'
sumber
int
ke representasi biner teksnya; Anda bahkan tidak memulai denganint
.Anda dapat menggunakan zfill:
cetakan:
Saya suka solusi ini, karena tidak hanya membantu saat mengeluarkan nomor, tetapi ketika Anda perlu menetapkannya ke variabel ... misalnya - x = str (datetime.date.today (). Bulan) .zfill (2) akan return x sebagai '02' untuk bulan Februari.
sumber
bin(14)
memberikan `'0b1110'` danbin(14).zfill(8)
memberikan `'000b1110'` bukan `'0b00001110'` yang merupakan apa yang diinginkan