Mengubah integer menjadi biner dengan python

179

Untuk mengonversi bilangan bulat menjadi biner, saya telah menggunakan kode ini:

>>> bin(6)  
'0b110'

dan kapan menghapus '0b', saya menggunakan ini:

>>> bin(6)[2:]  
'110'

Apa yang dapat saya lakukan jika saya ingin menunjukkan 6sebagai 00000110bukan 110?

Smith
sumber
2
Kemungkinan duplikat Python int ke biner?
Martin Thoma

Jawaban:

355
>>> '{0:08b}'.format(6)
'00000110'

Hanya untuk menjelaskan bagian-bagian dari string pemformatan:

  • {} menempatkan variabel ke dalam string
  • 0 mengambil variabel pada posisi argumen 0
  • :menambahkan opsi pemformatan untuk variabel ini (selain itu akan mewakili desimal 6)
  • 08 memformat angka menjadi delapan digit nol-empuk di sebelah kiri
  • b mengubah angka menjadi representasi binernya

Jika Anda menggunakan versi Python 3.6 atau lebih tinggi, Anda juga bisa menggunakan f-string:

>>> f'{6:08b}'
'00000110'
eumiro
sumber
7
Yang pertama 0berarti 0thargumen untuk format. Setelah titik dua adalah format, yang kedua 0berarti nol mengisi hingga 8 spasi dan buntuk biner
jamylak
@Aif: Juga, lihat dokumentasi standar docs.python.org/library/…
pepr
19
Hal ini dapat disederhanakan dengan format() fungsi : format(6, '08b'); fungsi mengambil nilai (apa {..}slot berlaku untuk) dan spesifikasi pemformatan (apa pun yang akan Anda masukkan setelah :dalam string pemformatan).
Martijn Pieters
4
'{0:08b}'.format(-6)-> '-0000110'. bagaimana jika Anda tidak ingin tanda? struct? -6%256?
n611x007
1
@ AK47 Ya, karena Pythoon 2.6 Anda dapat menulis konstanta int dalam bentuk biner dengan awalan 0b atau 0B: 0b00000110
Denis Barmenkov
102

Hanya ide lain:

>>> bin(6)[2:].zfill(8)
'00000110'

Cara yang lebih pendek melalui interpolasi string ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
sumber
7
Perhatikan bahwa solusi ini lebih cepat daripada yang diterima . Solusi mana yang lebih jelas (atau, berani saya katakan, Pythonic) mungkin masalah selera pribadi.
Air
Saya masih belajar esensi dari pythonicity, tetapi ini jelas jauh lebih fleksibel. Saya awalnya senang melihat solusi yang diterima dengan penjelasan elegan, tetapi khawatir bahwa objek yang dipanggil untuk melakukan metode ditulis sebagai string tunggal dengan semua spesifikasi yang dibangun, menghilangkan keterlibatan variabel dalam hal-hal seperti panjang yang diinginkan dari bitstring. Ini menyelesaikan sepenuhnya, dan sangat intuitif (setidaknya untuk Python 2) sehingga tidak perlu menjelaskan setiap karakter!
Posting169
Tidak bekerja untuk bilangan bulat negatif bin(-6)[2:].zfill(8)bertuliskan'0000b110'
jlandercy
20

Metode yang agak membingungkan ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
terisak
sumber
1
Metode yang bagus. Tapi saya tidak mengerti apa yang dilakukan bagian kode Anda: str ((x >> i) & 1)
Gregory
2
@Gregory: ini menggeser bit xke kanan dan AND dengan 1, secara efektif mengekstraksi satu bit (0 atau 1) pada suatu waktu.
usr2564301
16

Cukup gunakan fungsi format

format(6, "08b")

Bentuk umumnya adalah

format(<the_integer>, "<0><width_of_string><format_specifier>")
yang satu
sumber
1
Ya, saya suka yang ini, sederhana dan salah satu yang tercepat :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

Jawaban eumiro lebih baik, namun saya hanya memposting ini untuk variasi:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
sumber
3
Heh. Ini sangat salah, saya harus memperbaikinya. Menafsirkan angka sebagai desimal adalah hal yang licik. Lebih buruk lagi:'%08x' % int(bin(6)[2:], 16)
Fisikawan Gila
6

.. atau jika Anda tidak yakin harus selalu 8 digit, Anda dapat meneruskannya sebagai parameter:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
sebelum lahir
sumber
5

numpy.binary_repr(num, width=None) memiliki argumen lebar ajaib

Contoh yang relevan dari dokumentasi yang ditautkan di atas:

>>> np.binary_repr(3, width=4)
'0011'

Komplemen dua dikembalikan ketika nomor input negatif dan lebar ditentukan:

>>> np.binary_repr(-3, width=5)
'11101'
Tom Hale
sumber
4

Going Old School selalu berhasil

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))
Shadrack Kimutai
sumber
number=number/2memberi float, jadi number=number//2jahitan lebih baik, juga saya akan ganti number=number//2dengan number//=2dan b=b+"0"denganb+="0"
Brambor
juga, Anda tidak memiliki 0 padding seperti yang dibutuhkan OP
Brambor
1
('0' * 7 + bin(6)[2:])[-8:]

atau

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
sumber
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Nic3500
0

Dengan asumsi Anda ingin mem-parsing jumlah digit yang digunakan untuk mewakili dari variabel yang tidak selalu konstan, cara yang baik adalah dengan menggunakan numpy.binary.

bisa berguna saat Anda menerapkan biner ke set daya

import numpy as np
np.binary_repr(6, width=8)
ama
sumber
0

Cara terbaik adalah menentukan format.

format(a, 'b')

mengembalikan nilai biner dari dalam format string.

Untuk mengonversi string biner kembali ke integer, gunakan fungsi int ().

int('110', 2)

mengembalikan nilai integer dari string biner.

Pranjalya
sumber
Lebih baik format (a, '08b') untuk mendapatkan format yang diinginkan pengguna.
ZSG
0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Dmity Bryuhanov
sumber