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
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'
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
Odpowiedzi:
Żeby wyjaśnić części ciągu formatującego:
{}
umieszcza zmienną w łańcuchu0
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 stronieb
konwertuje liczbę na jej reprezentację binarnąJeśli używasz wersji Pythona 3.6 lub nowszej, możesz również użyć f-strings:
źródło
0
oznacza0th
argument doformat
. Po dwukropku to formatowanie, druga0
oznacza zero wypełnienia do 8 spacji, ab
dla binarnychformat()
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).'{0:08b}'.format(-6)
->'-0000110'
. co jeśli nie chcesz znaku?struct
?-6%256
?Po prostu kolejny pomysł:
Krótszy sposób dzięki interpolacji ciągów ( Python 3.6+ ):
źródło
bin(-6)[2:].zfill(8)
odczytywanych jako'0000b110'
Trochę dziwaczna metoda ...
źródło
x
prawo i wykonuje operację AND1
, skutecznie wydobywając jeden bit (0 lub 1) na raz.Po prostu użyj funkcji formatowania
Ogólna forma to
źródło
1000000 loops, best of 3: 556 ns per loop
odpowiedź eumiro jest lepsza, jednak publikuję to tylko dla odmiany:
źródło
'%08x' % int(bin(6)[2:], 16)
.. lub jeśli nie jesteś pewien, czy zawsze powinien mieć 8 cyfr, możesz podać go jako parametr:
źródło
numpy.binary_repr(num, width=None)
ma magiczny argument szerokościOdpowiednie przykłady z dokumentacji, do której link znajduje się powyżej:
źródło
Going Old School zawsze działa
źródło
number=number/2
Daje pływaka, więcnumber=number//2
szwy lepiej, także chciałbym wymienićnumber=number//2
zenumber//=2
ib=b+"0"
zeb+="0"
lub
źródło
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
źródło
Najlepszym sposobem jest określenie formatu.
zwraca wartość binarną a w formacie łańcucha.
Aby przekonwertować ciąg binarny z powrotem na liczbę całkowitą, użyj funkcji int ().
zwraca wartość całkowitą łańcucha binarnego.
źródło
źródło