Python int ke string biner?

530

Apakah ada metode Python kalengan untuk mengkonversi Integer (atau Panjang) menjadi string biner di Python?

Ada banyak sekali fungsi dec2bin () di Google ... Tapi saya berharap bisa menggunakan fungsi / pustaka bawaan.

Nate
sumber
Untuk pengambilan sebaliknya, untuk algoritma pemrosesan string murni, lihat ini .
CopyPasteIt

Jawaban:

750

Metode format string Python dapat mengambil format spec.

>>> "{0:b}".format(37)
'100101'

Memformat dokumen spesifikasi untuk Python 2

Memformat dokumen spesifikasi untuk Python 3

Tung Nguyen
sumber
86
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.

Contoh:

>>> bin(10)
'0b1010'
John Fouhy
sumber
66
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).
paxdiablo
sumber
1
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:

get_bin = lambda x: format(x, 'b')

print(get_bin(3))
>>> '11'

print(get_bin(-3))
>>> '-11'

Saat Anda menginginkan representasi n-bit:

get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'

Atau, jika Anda lebih suka memiliki fungsi:

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)
Martin Thoma
sumber
5
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().

kctong529
sumber
@GarethDavidson versi apa ini? Memiliki ini dinyatakan secara eksplisit mungkin lebih bermanfaat di masa depan ketika googling itu.
Wolf
Itu versi 2.7 saya pikir. Saya ragu itu akan berhasil dalam 3.x
Gareth Davidson
17

Cara mudah untuk melakukannya adalah dengan menggunakan format string, lihat halaman ini .

>> "{0:b}".format(10)
'1010'

Dan jika Anda ingin memiliki panjang tetap dari string biner, Anda dapat menggunakan ini:

>> "{0:{fill}8b}".format(10, fill='0')
'00001010'

Jika komplemen dua diperlukan, maka baris berikut dapat digunakan:

'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)

di mana n adalah lebar dari string biner.

Xiang
sumber
16

Ini untuk python 3 dan ini membuat angka nol di depannya!

print(format(0, '08b'))

masukkan deskripsi gambar di sini

grepit
sumber
1
Saya menghargai jawaban sederhana ini.
reergymerej
14

satu liner dengan lambda :

>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)

uji:

>>> binary(5)
'101'



EDIT :

tapi kemudian :(

t1 = time()
for i in range(1000000):
     binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922

dibandingkan dengan

t1 = time()
for i in range(1000000):
    '{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232
Aziz Alto
sumber
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=42
assert  "-101010" == format(-n, 'b')
assert  "-101010" == "{0:b}".format(-n)
assert  "-101010" == (lambda x: x >= 0 and 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.

Kontributor termasuk John Fouhy , Tung Nguyen , mVChr , Martin Thoma . dan Martijn Pieters.

BobStein-VisiBone
sumber
6
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.

integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')

Keluaran:

00111

Untuk kenyamanan di sini adalah tautan dokumen python untuk literal string yang diformat: https://docs.python.org/3/reference/lexical_analysis.html#f-strings .

John Forbes
sumber
7
>>> format(123, 'b')
'1111011'
Sandu Ursu
sumber
5

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)
batu sandungan
sumber
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:

def int2bin(integer, digits):
if integer >= 0:
    return bin(integer)[2:].zfill(digits)
else:
    return bin(2**digits + integer)[2:]

Ini menghasilkan:

>>> int2bin(10, 8)
'00001010'
>>> int2bin(-10, 8)
'11110110'
>>> int2bin(-128, 8)
'10000000'
>>> int2bin(127, 8)
'01111111'
Dekan
sumber
4

Kecuali saya salah paham apa yang Anda maksud dengan string biner, saya pikir modul yang Anda cari adalah struct

Van Gale
sumber
Lokasi baru .
Alan
4

Namun solusi lain dengan algoritma lain, dengan menggunakan operator bitwise.

def int2bin(val):
    res=''
    while val>0:
        res += str(val&1)
        val=val>>1     # val=val/2 
    return res[::-1]   # reverse the string

Versi yang lebih cepat tanpa membalik string.

def int2bin(val):
   res=''
   while val>0:
       res = chr((val&1) + 0x30) + res
       val=val>>1    
   return res 
Reza Abtin
sumber
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.
Andreas Magnusson
4
def binary(decimal) :
    otherBase = ""
    while decimal != 0 :
        otherBase  =  str(decimal % 2) + otherBase
        decimal    //=  2
    return otherBase

print binary(10)

keluaran:

1010

mukundan
sumber
4

Anda dapat melakukannya seperti itu:

bin(10)[2:]

atau :

f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c
Skiller Dz
sumber
bin (n). ganti ("0b", "")
sanner little
3

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
quents
sumber
3

di sini adalah solusi sederhana menggunakan divmod () fungsi yang mengembalikan pengingat dan hasil pembagian tanpa fraksi.

def dectobin(number):
    bin = ''
    while (number >= 1):
        number, rem = divmod(number, 2)
        bin = bin + str(rem)
    return bin
pengguna210021
sumber
Membutuhkan debugging. Panggilan dectobin(10)menghasilkan '0101'
Nate
3
n=input()
print(bin(n).replace("0b", ""))
Dblaze
sumber
3

numpy.binary_repr(num, width=None)

Contoh dari tautan dokumentasi di atas:

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

Komplemen dua dikembalikan ketika nomor input negatif dan lebar ditentukan:

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

Solusi yang agak mirip

def to_bin(dec):
    flag = True
    bin_str = ''
    while flag:
        remainder = dec % 2
        quotient = dec / 2
        if quotient == 0:
            flag = False
        bin_str += str(remainder)
        dec = quotient
    bin_str = bin_str[::-1] # reverse the string
    return bin_str 
Pedagang lilin
sumber
2

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']
ergonaut
sumber
2

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 / HEX

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



## PRINTING
print('------- 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')
HKC72
sumber
2

Untuk menghitung angka biner:

print("Binary is {0:>08b}".format(16))

Untuk menghitung desimal Hexa angka :

print("Hexa Decimal is {0:>0x}".format(15))

Untuk Menghitung semua biner no hingga 16 ::

for i in range(17):
   print("{0:>2}: binary is {0:>08b}".format(i))

Untuk menghitung Hexa desimal no hingga 17

 for i in range(17):
    print("{0:>2}: Hexa Decimal is {0:>0x}".format(i))
##as 2 digit is enogh for hexa decimal representation of a number
Rajesh Kumar Sahoo
sumber
1

Jika Anda bersedia menyerahkan Python "murni" tetapi mendapatkan banyak daya tembak, ada Sage - contoh di sini :

sage: a = 15
sage: a.binary()
'1111'

Anda akan perhatikan bahwa itu kembali sebagai string, jadi untuk menggunakannya sebagai angka Anda ingin melakukan sesuatu seperti

sage: eval('0b'+b)
15
kcrisman
sumber
1
try:
    while True:
        p = ""
        a = input()
        while a != 0:
            l = a % 2
            b = a - l
            a = b / 2
            p = str(l) + p
        print(p)
except:
    print ("write 1 number")
pengguna7930187
sumber
6
Mungkin ingin menambahkan penjelasan pada apa yang Anda lakukan di sana.
Artless
1

Saya menemukan metode yang menggunakan operasi matriks untuk mengkonversi desimal menjadi biner.

import numpy as np
E_mat = np.tile(E,[1,M])
M_order = pow(2,(M-1-np.array(range(M)))).T
bindata = np.remainder(np.floor(E_mat /M_order).astype(np.int),2)

Eadalah input data desimal, Madalah perintah biner. bindataadalah data biner keluaran, yang dalam format 1 oleh M binary matrix.

Galle He
sumber
0

Berikut ini adalah konverter biner ke desimal sederhana yang terus menerus diulang

t = 1
while t > 0:
    binaryNumber = input("Enter a binary No.")
    convertedNumber = int(binaryNumber, 2)

    print(convertedNumber)

print("")
Spencer Layland
sumber
Ini adalah urutan terbalik dari apa yang diinginkan OP. Mereka mencari int ke biner. Anda memberikan biner ke int.
Cecilia
0

Ini jawaban saya itu berfungsi dengan baik ..!

def binary(value) :
    binary_value = ''
    while value !=1  :
        binary_value += str(value%2)
        value = value//2
    return '1'+binary_value[::-1]
Charunie Hansika AM
sumber
Bagaimana jika Anda melewatkan nilainya 0? Misalnya binary(0)Anda akan mendapatkan apa yang Anda harapkan?
Andreas Magnusson