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?


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'

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'

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'

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>")

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

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'

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'

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))

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

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)

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.


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.