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.
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.
Jawaban:
Metode format string Python dapat mengambil format spec.
>>> "{0:b}".format(37)
'100101'
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).
0ke string pemformatan: format(10, '016b')format menjadi 16 digit dengan nol memimpin.
0di "{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 dengan hex(), itu ditambahkan dengan python 2.6.
Contoh:
>>> bin(10)
'0b1010'
str(bin(i))[2:](0,369 untuk 1000000ops) daripada "{0:b}".format(i)(0,721 untuk 1000000ops)
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.
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) 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):
s = "1" + sdan s = "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" + 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?
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)
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()dan hex().
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)).
zfillini lebih mudah dibaca dan dipahami daripada argumen kedua yang dinamis, jadi saya akan menyimpannya.
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().
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.
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
''dengan '0', tetapi itu akan menambahkan 0 untuk semua nomor.
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.
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.
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 .
>>> format(123, 'b')
'1111011'
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)
uint8array 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:
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'
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
Anda dapat melakukannya seperti itu:
bin(10)[2:]
atau :
f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c
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
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
dectobin(10)menghasilkan '0101'
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'
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
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 / 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')
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
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
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")
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.
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("")
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]
0? Misalnya binary(0)Anda akan mendapatkan apa yang Anda harapkan?