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?


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'

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'

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'

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

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

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'

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'

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

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

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)

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.


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.