Come si esprimono i letterali binari in Python?
Domanda
Come si esprime un numero intero come numero binario con i letterali Python?
Sono stato facilmente in grado di trovare la risposta per hex:
>>> 0x12AF
4783
>>> 0x100
256
e ottale:
>>> 01267
695
>>> 0100
64
Come si usano i letterali per esprimere il binario in Python?
Riepilogo delle risposte
- Python 2.5 e versioni precedenti:può esprimere l'uso binario
int('01010101111',2)
ma non con un valore letterale. - Python 2.5 e versioni precedenti:c'è non c'è modo per esprimere letterali binari.
- Python 2.6 beta:Puoi fare così:
0b1100111
O0B1100111
. - Python 2.6 beta:consentirà anche
0o27
O0O27
(il secondo carattere è la lettera O) per rappresentare un ottale. - Python 3.0 beta:Uguale alla versione 2.6, ma non consentirà più la versione precedente
027
sintassi per ottali.
Soluzione
Per riferimento-futuro Possibilità di Python:
A partire da Python 2.6 puoi esprimere valori letterali binari usando il prefisso 0b O 0B:
>>> 0b101111
47
Puoi anche usare il nuovo bidone funzione per ottenere la rappresentazione binaria di un numero:
>>> bin(173)
'0b10101101'
Versione di sviluppo della documentazione: Novità in Python 2.6
Altri suggerimenti
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
Un altro modo.
Come si esprimono i letterali binari in Python?
Non sono letterali "binari", ma piuttosto "letterali interi".È possibile esprimere valori letterali interi in formato binario con a 0
seguito da a B
O b
seguito da una serie di zeri e uno, ad esempio:
>>> 0b0010101010
170
>>> 0B010101
21
Dal Python 3 documenti, questi sono i modi per fornire valori letterali interi in Python:
I valori letterali interi sono descritti dalle seguenti definizioni lessicali:
integer ::= decinteger | bininteger | octinteger | hexinteger decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")* bininteger ::= "0" ("b" | "B") (["_"] bindigit)+ octinteger ::= "0" ("o" | "O") (["_"] octdigit)+ hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" bindigit ::= "0" | "1" octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F"
Non vi è alcun limite per la lunghezza dei letterali interi oltre a ciò che può essere immagazzinato nella memoria disponibile.
Tieni presente che non sono consentiti zeri iniziali in un numero decimale diverso da zero.Questo è per la disambiguazione con i letterali ottali in stile C, che Python ha usato prima della versione 3.0.
Alcuni esempi di valori letterali interi:
7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef 100_000_000_000 0b_1110_0101
Modificato nella versione 3.6: I caratteri di sottolineatura sono ora consentiti per scopi di raggruppamento in valori letterali.
Altri modi di esprimere il binario:
Puoi avere gli zeri e gli in un oggetto stringa che può essere manipolato (anche se probabilmente dovresti fare solo operazioni bit a bit sull'intero nella maggior parte dei casi) - passa semplicemente la stringa di zeri e uno e la base da cui stai convertendo (2 ):
>>> int('010101', 2)
21
Opzionalmente puoi avere il 0b
O 0B
prefisso:
>>> int('0b0010101010', 2)
170
Se lo passi 0
come base, assumerà base 10 se la stringa non specifica con un prefisso:
>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21
Conversione da int a binario leggibile dall'uomo:
Puoi passare un numero intero a bin per vedere la rappresentazione di stringa di un letterale binario:
>>> bin(21)
'0b10101'
E puoi combinare bin
E int
andare avanti e indietro:
>>> bin(int('010101', 2))
'0b10101'
Puoi anche utilizzare una specifica di formato, se desideri avere una larghezza minima con zeri precedenti:
>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
0 all'inizio qui specifica che la base è 8 (non 10), il che è abbastanza facile da vedere:
>>> int('010101', 0)
4161
Se non inizi con uno 0, Python presuppone che il numero sia in base 10.
>>> int('10101', 0)
10101
Per quanto ne so, Python, fino alla versione 2.5, supporta solo valori letterali esadecimali e ottali.Ho trovato alcune discussioni sull'aggiunta di binari alle versioni future ma nulla di definito.
Sono abbastanza sicuro che questa sia una delle cose dovute al cambiamento in Python 3.0 con forse bin() da abbinare a hex() e oct().
MODIFICARE:La risposta di lbrandy è corretta in tutti i casi.