Konwersja liczby całkowitej na binarną w Pythonie

179

Aby przekonwertować liczbę całkowitą na binarną, użyłem tego kodu:

>>> bin(6)  
'0b110'

a kiedy skasować „0b”, używam tego:

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

Co mogę zrobić, jeśli chcę wyświetlać 6jako 00000110zamiast 110?

Kowal
źródło
2
Możliwy duplikat int Pythona do binarnego?
Martin Thoma,

Odpowiedzi:

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

Żeby wyjaśnić części ciągu formatującego:

  • {} umieszcza zmienną w łańcuchu
  • 0 przyjmuje zmienną na pozycji argumentu 0
  • :dodaje opcje formatowania dla tej zmiennej (w przeciwnym razie reprezentowałaby liczbę dziesiętną 6)
  • 08 formatuje liczbę do ośmiu cyfr z zerami po lewej stronie
  • b konwertuje liczbę na jej reprezentację binarną

Jeśli używasz wersji Pythona 3.6 lub nowszej, możesz również użyć f-strings:

>>> f'{6:08b}'
'00000110'
eumiro
źródło
7
Pierwsza 0oznacza 0thargument do format. Po dwukropku to formatowanie, druga 0oznacza zero wypełnienia do 8 spacji, a bdla binarnych
jamylak
@Aif: Zapoznaj się również ze standardową dokumentacją docs.python.org/library/ ...
pepr
19
Można to uprościć za pomocą format() funkcji :format(6, '08b'); funkcja przyjmuje wartość (do czego{..}odnosi się slot) i specyfikację formatowania (cokolwiek byś umieścił po ciągu:w ciągu formatującym).
Martijn Pieters
4
'{0:08b}'.format(-6)-> '-0000110'. co jeśli nie chcesz znaku? struct? -6%256?
n611x007
1
@ AK47 Tak, od Pythoon 2.6 można zapisywać stałe int w postaci binarnej z prefiksem 0b lub 0B: 0b00000110
Denis Barmenkov
102

Po prostu kolejny pomysł:

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

Krótszy sposób dzięki interpolacji ciągów ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
źródło
7
Zauważ, że to rozwiązanie jest szybsze niż zaakceptowane . Które rozwiązanie jest bardziej jasne (lub, ośmielę się to powiedzieć, Pythonic) jest prawdopodobnie kwestią osobistego gustu.
Air
Wciąż uczę się istoty pytoniczności, ale jest to zdecydowanie bardziej uniwersalne. Początkowo byłem podekscytowany, widząc zaakceptowane rozwiązanie z eleganckim wyjaśnieniem, ale zaalarmowałem, że obiekt wywoływany do wykonania metod został zapisany jako pojedynczy ciąg z wbudowanymi wszystkimi specyfikacjami, eliminując udział zmiennych w takich rzeczach, jak pożądana długość bitstring. To całkowicie rozwiązuje ten problem i jest tak intuicyjne (przynajmniej dla Pythona 2), że nie ma potrzeby wyjaśniania każdego znaku!
169
Nie działa dla ujemnych liczb całkowitych bin(-6)[2:].zfill(8)odczytywanych jako'0000b110'
jlandercy
20

Trochę dziwaczna metoda ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
sobel
źródło
1
Niezła metoda. Ale nie mogłem zrozumieć, co robi ta część twojego kodu: str ((x >> i) & 1)
Gregory
2
@Gregory: przesuwa bity w xprawo i wykonuje operację AND 1, skutecznie wydobywając jeden bit (0 lub 1) na raz.
usr2564301
16

Po prostu użyj funkcji formatowania

format(6, "08b")

Ogólna forma to

format(<the_integer>, "<0><width_of_string><format_specifier>")
jeden
źródło
1
Tak, podoba mi się ten, jest prosty i jeden z najszybszych :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

odpowiedź eumiro jest lepsza, jednak publikuję to tylko dla odmiany:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
źródło
3
Heh. To jest tak bardzo złe, że musiałem to głosować. Interpretowanie cyfr jako dziesiętnych jest sprytne. Co gorsza:'%08x' % int(bin(6)[2:], 16)
Mad Physicist
6

.. lub jeśli nie jesteś pewien, czy zawsze powinien mieć 8 cyfr, możesz podać go jako parametr:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
thebjorn
źródło
5

numpy.binary_repr(num, width=None) ma magiczny argument szerokości

Odpowiednie przykłady z dokumentacji, do której link znajduje się powyżej:

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

Uzupełnienie do dwóch jest zwracane, gdy liczba wejściowa jest ujemna i określono szerokość:

>>> np.binary_repr(-3, width=5)
'11101'
Tom Hale
źródło
4

Going Old School zawsze działa

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
źródło
number=number/2Daje pływaka, więc number=number//2szwy lepiej, także chciałbym wymienić number=number//2ze number//=2i b=b+"0"zeb+="0"
Brambor
również nie masz dopełnienia 0, ponieważ wymagany jest PO
Brambor
1
('0' * 7 + bin(6)[2:])[-8:]

lub

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500,
0

Zakładając, że chcesz przeanalizować liczbę cyfr używanych do reprezentacji ze zmiennej, która nie zawsze jest stała, dobrym sposobem będzie użycie numpy.binary.

może być przydatne, gdy stosujesz binarny do zestawów potęg

import numpy as np
np.binary_repr(6, width=8)
ama
źródło
0

Najlepszym sposobem jest określenie formatu.

format(a, 'b')

zwraca wartość binarną a w formacie łańcucha.

Aby przekonwertować ciąg binarny z powrotem na liczbę całkowitą, użyj funkcji int ().

int('110', 2)

zwraca wartość całkowitą łańcucha binarnego.

Pranjalya
źródło
Lepszy byłby format (a, '08b'), aby uzyskać format pożądany przez użytkownika.
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
źródło