str.format()hanya untuk memformat satu nilai berlebihan. Langsung ke format()fungsi : format(n, 'b'). Tidak perlu mem-parsing placeholder dan mencocokkannya dengan argumen, langsung ke operasi pemformatan nilai itu sendiri. Hanya gunakan str.format()jika Anda perlu menempatkan hasil yang diformat dalam string yang lebih panjang (mis. Gunakan itu sebagai templat).
Martijn Pieters
29
@ Mike: Atau gunakan spesifikasi pemformatan. Tambahkan jumlah digit dengan memimpin 0ke string pemformatan: format(10, '016b')format menjadi 16 digit dengan nol memimpin.
Martijn Pieters
Dalam hal ini 0di "{0:b}"dapat dijatuhkan tidak? Maksud saya, dalam kasus di mana hanya satu angka yang diformat, itu benar untuk dimasukkan "{:b}", bukan?
tomasyany
1
biasanya orang akan menggunakan 4/8 / ... representasi bit:"{:08b}".format(37)
Sparkler
2
f "{37: b}" dalam Python3.7 atau yang lebih baru.
DA
471
Jika Anda mencari bin()yang setara dengan hex(), itu ditambahkan dengan python 2.6.
Perhatikan juga bahwa ini lebih cepat dilakukan str(bin(i))[2:](0,369 untuk 1000000ops) daripada "{0:b}".format(i)(0,721 untuk 1000000ops)
mVChr
64
@ mVChr jika seseorang mengubah angka menjadi representasi biner ASCII, saya sangat berharap kecepatan tidak masalah.
Nick T
29
@ mVChr: str.format()alat yang salah, Anda akan menggunakan format(i, 'b')sebagai gantinya. Mempertimbangkan bahwa itu juga memberi Anda opsi padding dan alignment; format(i, '016b')untuk memformat ke angka biner 16-bit nol-empuk. Untuk melakukan hal yang sama dengan bin()Anda harus menambahkan str.zfill()panggilan: bin(i)[2:].zfill(16)(tidak perlu menelepon str()!). format()Keterbacaan dan fleksibilitasnya (pemformatan dinamis jauh lebih sulit bin()) adalah pengorbanan yang hebat, jangan optimalkan kinerja kecuali Anda harus, sampai kemudian optimalkan untuk pemeliharaan.
Martijn Pieters
Apa artinya [2:]?
zero_cool
4
Tentu saja, dengan python 3.6+ kini Anda dapat menggunakannya f"{37:b}".
Luke Davis
63
Python sebenarnya sudah memiliki sesuatu yang sudah dibangun untuk ini, kemampuan untuk melakukan operasi seperti '{0:b}'.format(42), yang akan memberi Anda pola bit (dalam string) untuk 42, atau 101010.
Untuk filosofi yang lebih umum, tidak ada bahasa atau perpustakaan akan memberikan basis penggunanya segala yang mereka inginkan. Jika Anda bekerja di lingkungan yang tidak menyediakan apa yang Anda butuhkan, Anda harus mengumpulkan potongan kode saat Anda mengembangkan untuk memastikan Anda tidak perlu menulis hal yang sama dua kali. Seperti, misalnya, kode pseudo:
define intToBinString, receiving intVal:if intVal is equal to zero:return"0"
set strVal to ""while intVal is greater than zero:if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
yang akan membangun string biner Anda berdasarkan nilai desimal. Hanya perlu diingat bahwa itu adalah kode pseudo-generik yang mungkin bukan cara paling efisien untuk melakukannya, dengan iterasi yang Anda usulkan, itu tidak akan membuat banyak perbedaan. Ini benar-benar hanya dimaksudkan sebagai pedoman tentang bagaimana hal itu bisa dilakukan.
Gagasan umum adalah menggunakan kode dari (sesuai urutan pilihan):
bahasa atau pustaka bawaan.
perpustakaan pihak ketiga dengan lisensi yang sesuai.
koleksi Anda sendiri.
sesuatu yang baru yang perlu Anda tulis (dan simpan di koleksi Anda sendiri untuk nanti).
Beberapa saran bagus dalam jawaban ini. Sayang sekali kodenya lambat. Anda mengusulkan algo O (N ^ 2) di mana O (N) akan dilakukan. Bagian yang bermasalah adalah di garis s = "1" + sdan s = "0" + s. Masing-masing membuat salinan s yang tidak perlu. Anda harus membalikkan string tepat sebelum mengembalikannya.
Andreas Magnusson
@ Andreas, apa yang saya usulkan adalah untuk digunakan '{0:b}'.format(42), metode lambat hanyalah sebuah contoh bagaimana melakukannya secara umum, yang mungkin atau mungkin bukan O (n ^ 2) tergantung pada bahasa aktual yang digunakan. Ini hanya terlihat seperti Python karena Python adalah bahasa pseudo-code yang ideal jadi saya akan mengubahnya agar menjadi jelas.
paxdiablo
Sebenarnya itu akan menjadi bahasa yang sangat esoterik di mana s = "1" + sbukan O (N) ketika sadalah tipe string. Mungkin bahasa tempat semua string disimpan mundur atau masing-masing karakter adalah simpul dalam daftar tertaut? Untuk bahasa apa pun, string pada dasarnya adalah array karakter. Dalam hal awalan string mengharuskan salinan dibuat, bagaimana lagi Anda akan menempatkan karakter sebelum karakter lain?
Andreas Magnusson
Saya dapat dengan mudah membayangkan tipe string yang terdiri dari blok memori di mana string dibenarkan dengan benar di dalam blok itu, dan offset ke karakter awal. Untuk mengawali karakter, Anda cukup mengurangi offset dan menyimpan karakter di sana. Ya, itu akan menjadi esoteris tetapi tidak masuk akal bagi saya untuk berdebat tentang kemungkinan masalah dunia nyata dengan sedikit kode semu, terutama karena Anda tidak mungkin memiliki lebih dari beberapa lusin bit / iterasi. Bahkan jenis bubble yang banyak difitnah sudah memadai jika ukuran data Anda kecil :-) Bagaimanapun, saya akan menambahkan catatan tentang efisiensi.
paxdiablo
Tentu, jika efisiensi penting Anda mungkin tidak akan memilih python untuk memulai. Masih Dalam pengalaman saya itu sering terjadi bahwa kode yang ditulis secara naif menggunakan O (N²) algo dan diuji dengan set data kecil dengan cepat digunakan dengan set data yang jauh lebih besar karena "tampaknya berfungsi". Kemudian tiba-tiba Anda memiliki kode yang membutuhkan waktu berjam-jam untuk menjalankannya ketika diperbaiki mungkin hanya membutuhkan beberapa detik. O (N²) algo berbahaya karena mereka tampaknya bekerja untuk sementara waktu tetapi ketika data Anda menskala mereka tidak dan pada saat itu orang yang menulisnya telah berhenti dan tidak ada yang tahu mengapa hal-hal itu berlangsung selamanya.
Andreas Magnusson
41
Jika Anda ingin representasi tekstual tanpa awalan 0b, Anda bisa menggunakan ini:
def get_bin(x, n=0):"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""return format(x,'b').zfill(n)
Atau gunakan saja format(integer, 'b'). bin()adalah alat debugging, khusus ditujukan untuk menghasilkan sintaks literal biner integer biner Python , format()dimaksudkan untuk menghasilkan format tertentu.
Martijn Pieters
1
@ MartijnPieters Terima kasih banyak telah menyebutkannya. Saya telah menyesuaikan solutusi saya. Bagaimana Anda tahu itu bin()adalah alat debugging yang bertujuan menghasilkan sintaks literal biner integer Biner? Saya tidak dapat menemukannya di dokumentasi.
Martin Thoma
2
Dari dokumentasi: Hasilnya adalah ekspresi Python yang valid . Tujuannya adalah untuk menghasilkan ekspresi Python, bukan untuk menghasilkan representasi pengguna akhir. Hal yang sama berlaku untuk oct()dan hex().
Martijn Pieters
4
Lebih banyak alternatif: Jika Anda akan membuat lebar dinamis, alih-alih str.zfill()Anda bisa menggunakan str.format()atau format()dengan argumen kedua yang dinamis: '{0:0{1}b}'.format(x, n)atau format(b, '0{}b'.format(n)).
Martijn Pieters
@ MartijnPieters Wow, terima kasih banyak atas masukan ini! Saya tidak tahu bahwa ini mungkin dengan format. Namun, saya pikir jawaban saya saat zfillini lebih mudah dibaca dan dipahami daripada argumen kedua yang dinamis, jadi saya akan menyimpannya.
Martin Thoma
38
Sebagai acuan:
def toBinary(n):return''.join(str(1& int(n)>> i)for i in range(64)[::-1])
Fungsi ini dapat mengkonversi bilangan bulat positif sebesar 18446744073709551615, diwakili sebagai string '1111111111111111111111111111111111111111111111111111111111111111'.
Ini dapat dimodifikasi untuk melayani bilangan bulat yang jauh lebih besar, meskipun mungkin tidak berguna seperti "{0:b}".format()atau bin().
yang mengembalikan '' untuk 0. Bukankah representasi normal untuk 0 menjadi '0'?
dietbacon
jika Anda ingin melihat 0 itu :), Anda bisa menggantinya ''dengan '0', tetapi itu akan menambahkan 0 untuk semua nomor.
Aziz Alto
11
Ringkasan alternatif:
n=42assert"-101010"== format(-n,'b')assert"-101010"=="{0:b}".format(-n)assert"-101010"==(lambda x: x >=0and str(bin(x))[2:]or"-"+ str(bin(x))[3:])(-n)assert"0b101010"== bin(n)assert"101010"== bin(n)[2:]# But this won't work for negative numbers.
str.format()hanya untuk memformat satu nilai berlebihan. Langsung ke format()fungsi: format(n, 'b'). Tidak perlu menguraikan placeholder dan mencocokkannya dengan argumen seperti itu.
Martijn Pieters
10
Karena jawaban sebelumnya sebagian besar menggunakan format (), berikut ini adalah implementasi f-string.
Menggunakan paket numpy / unpackbits, mereka adalah teman terbaik Anda.
Examples-------->>> a = np.array([[2],[7],[23]], dtype=np.uint8)>>> a
array([[2],[7],[23]], dtype=uint8)>>> b = np.unpackbits(a, axis=1)>>> b
array([[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,1,1],[0,0,0,1,0,1,1,1]], dtype=uint8)
Pertanyaannya adalah tentang representasi string . Tetap saja, ini kebetulan apa yang saya cari tanpa melalui string terlebih dahulu! :)
Tom Hale
The acara dokumenter mengatakan: elemen membongkar dari uint8array yang menjadi output array biner bernilai. Sangat baik untuk nilai hingga 255.
Tom Hale
5
Bagi kita yang perlu mengkonversi bilangan bulat yang ditandatangani (rentang -2 ** (digit-1) ke 2 ** (digit-1) -1) menjadi string biner komplemen 2, ini berfungsi:
Versi kedua jelas tidak lebih cepat karena Anda berakhir dengan sesuatu seperti algoritma O (N ^ 2) daripada O (N). Saya telah melihat hal-hal seperti ini membunuh aplikasi (kinerja-bijaksana) karena pengembang berpikir melakukan pass tambahan pada akhirnya lebih lambat daripada melakukan beberapa hal tambahan di loop pertama. Setelah diperbaiki, waktu tayang diturunkan dari hari ke detik.
Ini kode yang baru saja saya terapkan. Ini bukan metode tetapi Anda dapat menggunakannya sebagai fungsi yang siap digunakan !
def inttobinary(number):if number ==0:return str(0)
result =""while(number !=0):
remainder = number%2
number = number/2
result += str(remainder)return result[::-1]# to invert the string
Inilah cara lain menggunakan matematika reguler, tidak ada loop, hanya rekursi. (Kasus sepele 0 tidak menghasilkan apa-apa).
def toBin(num):if num ==0:return""return toBin(num//2)+ str(num%2)print([(toBin(i))for i in range(10)])['','1','10','11','100','101','110','111','1000','1001']
Kalkulator dengan semua fungsi yang diperlukan untuk DEC, BIN, HEX: (dibuat dan diuji dengan Python 3.5)
Anda dapat mengubah nomor tes input dan mendapatkan yang dikonversi.
# CONVERTER: DEC / BIN / HEXdef dec2bin(d):# dec -> bin
b = bin(d)return b
def dec2hex(d):# dec -> hex
h = hex(d)return h
def bin2dec(b):# bin -> dec
bin_numb="{0:b}".format(b)
d = eval(bin_numb)return d,bin_numb
def bin2hex(b):# bin -> hex
h = hex(b)return h
def hex2dec(h):# hex -> dec
d = int(h)return d
def hex2bin(h):# hex -> bin
b = bin(h)return b
## TESTING NUMBERS
numb_dec =99
numb_bin =0b0111
numb_hex =0xFF## CALCULATIONS
res_dec2bin = dec2bin(numb_dec)
res_dec2hex = dec2hex(numb_dec)
res_bin2dec,bin_numb = bin2dec(numb_bin)
res_bin2hex = bin2hex(numb_bin)
res_hex2dec = hex2dec(numb_hex)
res_hex2bin = hex2bin(numb_hex)## PRINTINGprint('------- DECIMAL to BIN / HEX -------\n')print('decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n')print('------- BINARY to DEC / HEX -------\n')print('binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n')print('----- HEXADECIMAL to BIN / HEX -----\n')print('hexadec:',hex(numb_hex),'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n')
Jawaban:
Metode format string Python dapat mengambil format spec.
Memformat dokumen spesifikasi untuk Python 2
Memformat dokumen spesifikasi untuk Python 3
sumber
str.format()
hanya untuk memformat satu nilai berlebihan. Langsung keformat()
fungsi :format(n, 'b')
. Tidak perlu mem-parsing placeholder dan mencocokkannya dengan argumen, langsung ke operasi pemformatan nilai itu sendiri. Hanya gunakanstr.format()
jika Anda perlu menempatkan hasil yang diformat dalam string yang lebih panjang (mis. Gunakan itu sebagai templat).0
ke string pemformatan:format(10, '016b')
format menjadi 16 digit dengan nol memimpin.0
di"{0:b}"
dapat dijatuhkan tidak? Maksud saya, dalam kasus di mana hanya satu angka yang diformat, itu benar untuk dimasukkan"{:b}"
, bukan?"{:08b}".format(37)
Jika Anda mencari
bin()
yang setara denganhex()
, itu ditambahkan dengan python 2.6.Contoh:
sumber
str(bin(i))[2:]
(0,369 untuk 1000000ops) daripada"{0:b}".format(i)
(0,721 untuk 1000000ops)str.format()
alat yang salah, Anda akan menggunakanformat(i, 'b')
sebagai gantinya. Mempertimbangkan bahwa itu juga memberi Anda opsi padding dan alignment;format(i, '016b')
untuk memformat ke angka biner 16-bit nol-empuk. Untuk melakukan hal yang sama denganbin()
Anda harus menambahkanstr.zfill()
panggilan:bin(i)[2:].zfill(16)
(tidak perlu meneleponstr()
!).format()
Keterbacaan dan fleksibilitasnya (pemformatan dinamis jauh lebih sulitbin()
) adalah pengorbanan yang hebat, jangan optimalkan kinerja kecuali Anda harus, sampai kemudian optimalkan untuk pemeliharaan.f"{37:b}"
.Python sebenarnya sudah memiliki sesuatu yang sudah dibangun untuk ini, kemampuan untuk melakukan operasi seperti
'{0:b}'.format(42)
, yang akan memberi Anda pola bit (dalam string) untuk42
, atau101010
.Untuk filosofi yang lebih umum, tidak ada bahasa atau perpustakaan akan memberikan basis penggunanya segala yang mereka inginkan. Jika Anda bekerja di lingkungan yang tidak menyediakan apa yang Anda butuhkan, Anda harus mengumpulkan potongan kode saat Anda mengembangkan untuk memastikan Anda tidak perlu menulis hal yang sama dua kali. Seperti, misalnya, kode pseudo:
yang akan membangun string biner Anda berdasarkan nilai desimal. Hanya perlu diingat bahwa itu adalah kode pseudo-generik yang mungkin bukan cara paling efisien untuk melakukannya, dengan iterasi yang Anda usulkan, itu tidak akan membuat banyak perbedaan. Ini benar-benar hanya dimaksudkan sebagai pedoman tentang bagaimana hal itu bisa dilakukan.
Gagasan umum adalah menggunakan kode dari (sesuai urutan pilihan):
sumber
s = "1" + s
dans = "0" + s
. Masing-masing membuat salinan s yang tidak perlu. Anda harus membalikkan string tepat sebelum mengembalikannya.'{0:b}'.format(42)
, metode lambat hanyalah sebuah contoh bagaimana melakukannya secara umum, yang mungkin atau mungkin bukan O (n ^ 2) tergantung pada bahasa aktual yang digunakan. Ini hanya terlihat seperti Python karena Python adalah bahasa pseudo-code yang ideal jadi saya akan mengubahnya agar menjadi jelas.s = "1" + s
bukan O (N) ketikas
adalah tipe string. Mungkin bahasa tempat semua string disimpan mundur atau masing-masing karakter adalah simpul dalam daftar tertaut? Untuk bahasa apa pun, string pada dasarnya adalah array karakter. Dalam hal awalan string mengharuskan salinan dibuat, bagaimana lagi Anda akan menempatkan karakter sebelum karakter lain?Jika Anda ingin representasi tekstual tanpa awalan 0b, Anda bisa menggunakan ini:
Saat Anda menginginkan representasi n-bit:
Atau, jika Anda lebih suka memiliki fungsi:
sumber
format(integer, 'b')
.bin()
adalah alat debugging, khusus ditujukan untuk menghasilkan sintaks literal biner integer biner Python ,format()
dimaksudkan untuk menghasilkan format tertentu.bin()
adalah alat debugging yang bertujuan menghasilkan sintaks literal biner integer Biner? Saya tidak dapat menemukannya di dokumentasi.oct()
danhex()
.str.zfill()
Anda bisa menggunakanstr.format()
atauformat()
dengan argumen kedua yang dinamis:'{0:0{1}b}'.format(x, n)
atauformat(b, '0{}b'.format(n))
.zfill
ini lebih mudah dibaca dan dipahami daripada argumen kedua yang dinamis, jadi saya akan menyimpannya.Sebagai acuan:
Fungsi ini dapat mengkonversi bilangan bulat positif sebesar
18446744073709551615
, diwakili sebagai string'1111111111111111111111111111111111111111111111111111111111111111'
.Ini dapat dimodifikasi untuk melayani bilangan bulat yang jauh lebih besar, meskipun mungkin tidak berguna seperti
"{0:b}".format()
ataubin()
.sumber
Cara mudah untuk melakukannya adalah dengan menggunakan format string, lihat halaman ini .
Dan jika Anda ingin memiliki panjang tetap dari string biner, Anda dapat menggunakan ini:
Jika komplemen dua diperlukan, maka baris berikut dapat digunakan:
di mana n adalah lebar dari string biner.
sumber
Ini untuk python 3 dan ini membuat angka nol di depannya!
sumber
satu liner dengan lambda :
uji:
EDIT :
tapi kemudian :(
dibandingkan dengan
sumber
''
dengan'0'
, tetapi itu akan menambahkan 0 untuk semua nomor.Ringkasan alternatif:
Kontributor termasuk John Fouhy , Tung Nguyen , mVChr , Martin Thoma . dan Martijn Pieters.
sumber
str.format()
hanya untuk memformat satu nilai berlebihan. Langsung keformat()
fungsi:format(n, 'b')
. Tidak perlu menguraikan placeholder dan mencocokkannya dengan argumen seperti itu.Karena jawaban sebelumnya sebagian besar menggunakan format (), berikut ini adalah implementasi f-string.
Keluaran:
Untuk kenyamanan di sini adalah tautan dokumen python untuk literal string yang diformat: https://docs.python.org/3/reference/lexical_analysis.html#f-strings .
sumber
sumber
Menggunakan paket numpy / unpackbits, mereka adalah teman terbaik Anda.
sumber
uint8
array yang menjadi output array biner bernilai. Sangat baik untuk nilai hingga 255.Bagi kita yang perlu mengkonversi bilangan bulat yang ditandatangani (rentang -2 ** (digit-1) ke 2 ** (digit-1) -1) menjadi string biner komplemen 2, ini berfungsi:
Ini menghasilkan:
sumber
Kecuali saya salah paham apa yang Anda maksud dengan string biner, saya pikir modul yang Anda cari adalah struct
sumber
Namun solusi lain dengan algoritma lain, dengan menggunakan operator bitwise.
Versi yang lebih cepat tanpa membalik string.
sumber
keluaran:
sumber
Anda dapat melakukannya seperti itu:
atau :
sumber
Ini kode yang baru saja saya terapkan. Ini bukan metode tetapi Anda dapat menggunakannya sebagai fungsi yang siap digunakan !
sumber
di sini adalah solusi sederhana menggunakan divmod () fungsi yang mengembalikan pengingat dan hasil pembagian tanpa fraksi.
sumber
dectobin(10)
menghasilkan '0101'sumber
numpy.binary_repr(num, width=None)
Contoh dari tautan dokumentasi di atas:
sumber
Solusi yang agak mirip
sumber
Inilah cara lain menggunakan matematika reguler, tidak ada loop, hanya rekursi. (Kasus sepele 0 tidak menghasilkan apa-apa).
sumber
Kalkulator dengan semua fungsi yang diperlukan untuk DEC, BIN, HEX: (dibuat dan diuji dengan Python 3.5)
Anda dapat mengubah nomor tes input dan mendapatkan yang dikonversi.
sumber
sumber
Jika Anda bersedia menyerahkan Python "murni" tetapi mendapatkan banyak daya tembak, ada Sage - contoh di sini :
Anda akan perhatikan bahwa itu kembali sebagai string, jadi untuk menggunakannya sebagai angka Anda ingin melakukan sesuatu seperti
sumber
sumber
Saya menemukan metode yang menggunakan operasi matriks untuk mengkonversi desimal menjadi biner.
E
adalah input data desimal,M
adalah perintah biner.bindata
adalah data biner keluaran, yang dalam format 1 oleh M binary matrix.sumber
Berikut ini adalah konverter biner ke desimal sederhana yang terus menerus diulang
sumber
Ini jawaban saya itu berfungsi dengan baik ..!
sumber
0
? Misalnyabinary(0)
Anda akan mendapatkan apa yang Anda harapkan?