Python'da tamsayıyı ikiliye dönüştürme


179

Bir tamsayıyı bir ikili sayıya dönüştürmek için şu kodu kullandım:

>>> bin(6)  
'0b110'

ve '0b' ne zaman silinirse, bunu kullanıyorum:

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

Ben göstermek istiyorsanız ne yapabilirim 6olarak 00000110yerine 110?


Yanıtlar:


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

Biçimlendirme dizesinin bölümlerini açıklamak için:

  • {} bir değişkeni dizeye yerleştirir
  • 0 değişkeni 0 bağımsız değişkeninde alır
  • :bu değişken için biçimlendirme seçenekleri ekler (aksi takdirde ondalık sayıyı temsil eder 6)
  • 08 sayıyı solda sıfır dolgulu sekiz basamağa formatlar
  • b sayıyı ikili gösterimine dönüştürür

Python 3.6 veya daha yeni bir sürümünü kullanıyorsanız, f-dizeleri de kullanabilirsiniz:

>>> f'{6:08b}'
'00000110'

7
Birincisi 0, 0thargüman anlamına gelir format. İki nokta üst üste biçimlendirme işleminden sonra, ikincisi 08 boşluğa sıfır dolumu anlamına gelir ve bikili
jamylak

@Aif: Ayrıca, standart dokümanlara da bakın docs.python.org/library/…
pepr

19
Bu basitleştirilmiş edilebilir format() fonksiyonu : format(6, '08b'); işlev bir değer ( {..}yuvanın ne için geçerli olduğu) ve bir biçimlendirme belirtimi ( :biçimlendirme dizesinde sonra ne koyarsanız ) alır.
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. bir işaret istemezsen ne olur? struct? -6%256?
n611x007

1
@ AK47 Evet, Pythoon 2.6'dan beri int sabitlerini 0b veya 0B ön ekiyle ikili biçimde yazabilirsiniz: 0b00000110
Denis Barmenkov

102

Başka bir fikir:

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

Dize enterpolasyonu yoluyla daha kısa yol ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
Bu çözümün kabul edilenden daha hızlı olduğuna dikkat edin . Hangi çözüm daha açıktır (ya da söylemek gerekirse, Pythonic) muhtemelen kişisel bir zevk meselesidir.
Air

Hala pitonikliğin özünü öğreniyorum, ama bu açıkça çok daha yönlü. Başlangıçta zarif bir açıklama ile kabul edilen çözümü görmekten heyecanlandım, ancak yöntemleri yapmak için çağrılan nesnenin, tüm uzunluklarda yerleşik olarak tek bir dize olarak yazıldığını ve değişkenlerin istenen uzunluk gibi şeylere karışmasını engellediğini söyledim. bitstring. Bu tamamen çözer ve her karakteri açıklamaya gerek kalmayacak kadar sezgiseldir (en azından Python 2 için)!
Post169

Negatif tam sayı bin(-6)[2:].zfill(8)okumaları için çalışmaz'0000b110'
jlandercy

20

Biraz çevirme yöntemi ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
Güzel bir yöntem. Ancak kodunuzun bu bölümünün ne yaptığını anlayamadım: str ((x >> i) & 1)
Gregory

2
@Gregory: bitleri xsağa kaydırır ve AND ile aynı anda 1bir biti (0 veya 1) etkili bir şekilde çıkarır .
usr2564301

16

Biçimlendirme işlevini kullanmanız yeterlidir

format(6, "08b")

Genel form

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
Evet, bunu beğendim, basit ve en hızlılarından biri :-) 1000000 loops, best of 3: 556 ns per loop
SebMa

10

eumiro'nun cevabı daha iyi, ancak bunu sadece çeşitlilik için gönderiyorum:

>>> "%08d" % int(bin(6)[2:])
00000110

3
Heh. Bu çok derinden yanlış, onu kaldırmak zorunda kaldım. Basamakları ondalık olarak yorumlamak kurnazdır. Daha da kötüsü:'%08x' % int(bin(6)[2:], 16)
Mad Physicist

6

.. ya da her zaman 8 basamak olması gerektiğinden emin değilseniz, parametre olarak iletebilirsiniz:

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

5

numpy.binary_repr(num, width=None) büyü genişliği argümanı var

Yukarıda bağlantılı belgelerden ilgili örnekler:

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

Giriş numarası negatif olduğunda ve genişlik belirtildiğinde ikisinin tamamlayıcısı döndürülür:

>>> np.binary_repr(-3, width=5)
'11101'

4

Going Old School her zaman çalışır

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/2şamandıra verir, böylece number=number//2daha iyi dikişler, ben de number=number//2ile number//=2ve b=b+"0"yerineb+="0"
Brambor

Ayrıca, OP'nin gerektiği gibi 0 dolguya sahip değilsiniz
Brambor

1
('0' * 7 + bin(6)[2:])[-8:]

veya

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

2
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Nic3500

0

Her zaman sabit olmayan bir değişkenden temsil etmek için kullanılan basamak sayısını ayrıştırmak istediğinizi varsayarsak, iyi bir yol numpy.binary kullanmaktır.

güç setlerine ikili uyguladığınızda faydalı olabilir

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

0

En iyi yol biçimi belirlemektir.

format(a, 'b')

dizesinin biçimindeki a'nın ikili değerini döndürür.

İkili bir dizeyi tekrar tamsayıya dönüştürmek için int () işlevini kullanın.

int('110', 2)

ikili dizenin tamsayı değerini döndürür.


Kullanıcının istediği formatı elde etmek için format (a, '08b') daha iyi olur.
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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.