Próbuję przekonwertować liczbę całkowitą na binarną za pomocą funkcji bin () w Pythonie. Jednak zawsze usuwa wiodące zera, których faktycznie potrzebuję, tak że wynik jest zawsze 8-bitowy:
Przykład:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Czy jest na to sposób?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
źródło
źródło
Odpowiedzi:
Użyj
format()
funkcji :format()
Funkcja po prostu formatuje wejście w następstwie specyfikacji formatu mini języku .#
Sprawia format zawierać0b
prefiks, a010
wielkość formatuje wyjście wpasować szerokość 10 znaków, z0
wyściółką; 2 znaki na0b
prefiks, pozostałe 8 na cyfry binarne.Jest to najbardziej kompaktowa i bezpośrednia opcja.
Jeśli umieszczasz wynik w większym ciągu, użyj sformatowanego literału ciągu (3.6+) lub użyj
str.format()
i umieść drugi argumentformat()
funkcji po dwukropku symbolu zastępczego{:..}
:Tak się składa, że nawet przy formatowaniu pojedynczej wartości (bez umieszczania wyniku w większym ciągu) użycie sformatowanego literału ciągu jest szybsze niż użycie
format()
:Ale użyłbym tego tylko wtedy, gdy liczy się wydajność w ciasnej pętli, ponieważ
format(...)
lepiej przekazuje intencję.Jeśli nie chcesz
0b
prefiksu, po prostu upuść#
i dostosuj długość pola:źródło
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
i umieść drugi argument funkcji format () po dwukropku symbolu zastępczego{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
. użyj .Zobacz: Specyfikacja formatu Mini-język
Uwaga dla Pythona 2.6 lub starszego, nie możesz wcześniej pominąć identyfikatora argumentu pozycyjnego
:
, więc użyjźródło
str.format()
tutaj, kiedyformat()
zrobi. Brakuje0b
przedrostka.str.format
jest bardziej elastyczny niżformat()
dlatego, że pozwala na jednoczesne wykonywanie wielu zmiennych. Ciągle zapominam, że taformat
funkcja w ogóle istnieje. Trzeba przyznać, że w tym przypadku jest to całkowicie wystarczające.str.format()
tylko jednego{}
elementu, żadnego innego tekstu, nie używasz szablonów ciągów, formatujesz jedną wartość . W takim przypadku po prostu użyjformat()
. :-)ja używam
wydrukuje
źródło
Możesz użyć mini języka formatowania ciągów:
Próbny:
Wynik:
EDYCJA: na podstawie pomysłu @Martijn Pieters
źródło
#
. Jest teżformat()
, co oszczędza ci konieczności tworzenia pełnego szablonu ciągu.Korzystając z Pythona
>= 3.6
, najczystszym sposobem jest użycie f-stringów z formatowaniem ciągów :Wyjaśnienie:
var
zmienna do sformatowania:
wszystko po tym jest specyfikatorem formatu#
użyj alternatywnej formy (dodaje0b
przedrostek)0
wypełnij zerami10
pad do całkowitej długości z 10 (w tym 2 znaki dla0b
)b
użyj reprezentacji binarnej dla liczbyźródło
format(var, "#010b")
przekazuje intencje . Jest to jednak najszybsza opcja. Ale już to wiesz, prawda, ponieważ już opisuję wszystko, co zamieściłeś w mojej odpowiedzi.Czasami potrzebujesz tylko jednego prostego wkładu:
Python 3
źródło
[ ]
nie powinno być potrzebne -join()
akceptuje wyrażenie generatora.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
na konieczność wykonania dwóch przebiegów wejście generatora jest najpierw konwertowane na listę przed połączeniem. Ma to trochę negatywny wpływ na wydajność i czy w rzeczywistości lepiej jest tutaj przekazać zrozumienie listy niż wyrażenie generatora. To jeden, jeśli są wyjątkami od reguły.Możesz użyć czegoś takiego
źródło
"{:0{l}b}".format(num, l=length)
możesz użyć metody ciągów rjust składni Pythona: string.rjust (length, fillchar) fillchar jest opcjonalne
a na swoje pytanie piszesz w ten sposób
więc będzie to „0b00000001”
źródło
int
do jego tekstowej reprezentacji binarnej; nawet nie zaczynasz odint
.Możesz użyć zfill:
wydruki:
Podoba mi się to rozwiązanie, ponieważ pomaga nie tylko przy wyprowadzaniu liczby, ale gdy trzeba przypisać ją do zmiennej ... np. - x = str (datetime.date.today (). Month) .zfill (2) będzie zwraca x jako „02” dla miesiąca lutego.
źródło
bin(14)
daje `` 0b1110 '' ibin(14).zfill(8)
daje `` 000b1110 '' `` nie '' 0b00001110 '', co jest tym, czego oczekujemy