Come si esprimono letterali binari in Python?


351

Come si esprime un numero intero come numero binario con valori letterali Python?

Sono stato facilmente in grado di trovare la risposta per hex:

>>> 0x12AF
4783
>>> 0x100
256

e ottale:

>>> 01267
695
>>> 0100
64

Come usi i letterali per esprimere il binario in Python?


Riepilogo delle risposte

  • Python 2.5 e precedenti: può esprimere il binario usando int('01010101111',2)ma non con un valore letterale.
  • Python 2.5 e precedenti: non c'è modo di esprimere letterali binari.
  • Python 2.6 beta: puoi fare così: 0b1100111o 0B1100111.
  • Python 2.6 beta: consentirà anche 0o27o 0O27(il secondo carattere è la lettera O) per rappresentare un ottale.
  • Python 3.0 beta: uguale a 2.6, ma non consentirà più la 027sintassi precedente per gli ottali.

Risposte:


291

Per riferimento— future 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 la nuova funzione bin per ottenere la rappresentazione binaria di un numero:

>>> bin(173)
'0b10101101'

Versione di sviluppo della documentazione: Novità di Python 2.6


72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Un altro modo.


2
Questo è interessante quando si hanno stringhe, ma se si lavora con numeri puri, si aggiungono calcoli non necessari al codice.
Daniel Möller,

28

Come si esprimono letterali binari in Python?

Non sono letterali "binari", ma piuttosto "letterali interi". È possibile esprimere valori letterali interi con un formato binario con un 0seguito da un Bo bseguito da una serie di zeri e uno, ad esempio:

>>> 0b0010101010
170
>>> 0B010101
21

Dai documenti di Python 3 , questi sono i modi per fornire valori letterali interi in Python:

I 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 a parte ciò che può essere archiviato nella memoria disponibile.

Si noti che gli zeri iniziali in un numero decimale diverso da zero non sono consentiti. Questo è per chiarimento con i letterali ottali in stile C, che Python usava 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 ora sono consentiti per scopi di raggruppamento in valori letterali.

Altri modi di esprimere il binario:

Puoi avere gli zeri e quelli in un oggetto stringa che può essere manipolato (anche se nella maggior parte dei casi dovresti fare semplicemente operazioni bit a bit sull'intero) - passa semplicemente la stringa di zeri e uno e la base da cui stai convertendo (2 ):

>>> int('010101', 2)
21

Opzionalmente puoi avere il prefisso 0bo 0B:

>>> int('0b0010101010', 2)
170

Se lo passi 0come base, assumerà la base 10 se la stringa non specifica con un prefisso:

>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21

Conversione da int di nuovo in binario leggibile dall'uomo:

Puoi passare un numero intero al bin per vedere la rappresentazione di stringa di un letterale binario:

>>> bin(21)
'0b10101'

E puoi combinare bine intandare avanti e indietro:

>>> bin(int('010101', 2))
'0b10101'

Puoi usare anche una specifica di formato, se vuoi 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'

2

0 all'inizio qui specifica che la base è 8 (non 10), che è abbastanza facile da vedere:

>>> int('010101', 0)
4161

Se non inizi con uno 0, Python presuppone che il numero sia base 10.

>>> int('10101', 0)
10101

-1

Per quanto ne so, Python, fino alla 2.5, supporta solo letterali esadecimali e ottali. Ho trovato alcune discussioni sull'aggiunta di binari alle versioni future, ma nulla di definito.


-3

Sono abbastanza sicuro che questa sia una delle cose dovute al cambiamento in Python 3.0 con forse bin () per andare con hex () e oct ().

EDIT: la risposta di lbrandy è corretta in tutti i casi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.