
In Python, puoi gestire numeri e stringhe come binari (bin), ottali (ott) ed esadecimali (hex) oltre che decimali. Possono anche essere convertiti tra loro.
In questo articolo vengono descritti i seguenti contenuti.
- Scrivi numeri interi in notazione binaria, otale ed esadecimale
- Converti un numero in una stringa binaria, otale ed esadecimale
- bin(), ott(), hex()
- format(), str.format(), f-strings
- Converti un numero intero negativo in una stringa nella rappresentazione in complemento a due
- Converti una stringa binaria, otale ed esadecimale in un numero
- Esempi di utilizzo
- Aritmetica delle stringhe binarie
- Converti tra numeri binari, ottali ed esadecimali
Vedere il seguente articolo per le basi della conversione tra la stringa (str) e il numero (int, float).
Scrivi numeri interi in notazione binaria, otale ed esadecimale
Aggiungendo i prefissi 0b, 0o e 0x, i numeri in di tipo intero possono essere scritti rispettivamente in binario, ottale ed esadecimale. L’output di print() sarà in notazione decimale.
bin_num = 0b10
oct_num = 0o10
hex_num = 0x10
print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16
Puoi anche usare 0B, 0O e 0X maiuscoli.
Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10
print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16
Anche con un prefisso, il tipo è un intero int.
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
Dal momento che sono int, possono essere azionati come al solito.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
In Python3.6 e versioni successive, puoi inserire caratteri di sottolineatura _ nei numeri. Ripetendo il carattere di _ si generi un errore, ma puoi inserirne quanti ne vuoi se non viene sottolineato.
Il carattere di sottolineatura _ può essere utilizzato come delimitatore quando sono presenti molte cifre. Ad esempio è più facile da leggere vedere _ ogni quattro cifre.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Converti un numero in una stringa binaria, otale ed esadecimale
È possibile utilizzare le seguenti funzioni per un numero in una stringa binaria, ottale o esadecimale.
- Funzione incorporata bin(), oct(), hex()
- Funzione incorporata format(), metodo stringa str.format(), f-strings
Descrive anche come ottenere una stringa nella rappresentazione in complemento a due per un valore negativo.
bin(), ott(), hex()
Le funzioni integrano bin(), oct() ex() possono essere utilizzate per un numero necessario in una stringa, otale ed esadecimale. Queste funzioni restituiscono una stringa con i prefissi 0b,0o e 0x, rispettivamente.
i = 255
print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff
print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Se non hai bisogno del prefisso, usa la slice [2:] per estrarre le stringhe finali o usa format() come segue di seguito.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Se vuoi desiderare in una stringa decimale, usa str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
format(), str.format(), f-strings
La funzione incorporata format() e f strings possono anche essere usati per il metodo utilizzato per un numero in una stringa binaria, ottale ed esadecimale.
Specificando b, oex nella stringa di specifica del formato del secondo argomento di format(), un numero può essere convertito rispettivamente in una stringa binaria, ottale ed esadecimale.
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff
print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Se vuoi ottenere la stringa di caratteri con il prefisso 0b, 0o, 0x, aggiungi # alla stringa di specifica del formato.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
È anche possibile inserire zero (0) con qualsiasi numero di cifre. Si noti che il numero di caratteri per il prefisso (due caratteri) deve essere preso in considerazione anche quando si riempie zero con un prefisso.
print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff
print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff
Il metodo stringa str.format() può essere utilizzato per la stessa conversione.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
In Python3.6 o versioni successive, puoi anche usare le f-strings (f’xxx’).
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Converti un numero intero negativo in una stringa nella rappresentazione in complemento a due
Quando si utilizza bin() o format(), gli interi negativi vengono convertiti in valori assoluti con un segno meno.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
In Python, le operazioni bit per bit sugli interi negativi vengono nella rappresentazione in complemento a due, quindi se vuoi ottenere una stringa espressa nella rappresentazione in complemento a due, prendi il bit per bit e & del numero massimo di cifre, ad esempio , 0b1111 (= 0xf ) per 4 bit, 0xff per 8 bit e 0xffff per 16 bit.
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Converti una stringa binaria, otale ed esadecimale in un numero
int()
Utilizzare la funzione incorporata int() per una stringa binaria, ottale ed esadecimale in un numero.
Puoi scegliere una stringa binaria, otale ed esadecimale in un numero intero basato sulla radice con int(string, radix). Se radix viene omesso, si presume che sia un numero decimale.
print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16
print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>
Se imposti radix su 0, verrà convertito in base al prefisso (0b, 0o, 0x o 0B, 0O, 0X).
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16
print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16
Quando la radice è 0, una stringa senza prefisso viene convertita in un numero decimale. In tal caso, si noti che si verificherà un errore se l’inizio (lato sinistro) viene riempito con 0.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
In altri casi, la stringa riempita con 0 può essere convertita.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Viene generato un errore se la stringa non può essere convertita in base alla radice o al prefisso specificato.
# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'
# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'
# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'
Esempi di utilizzo
Aritmetica delle stringhe binarie
Ad esempio, se si desidera utilizzare una stringa binaria con il prefisso 0b, è possibile convertirla facilmente in un intero int, operare qualcosa e quindi riconvertirla nella stringa str.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Converti tra numeri binari, ottali ed esadecimali
È anche facile provare tra loro stringhe binarie, ottali ed esadecimali. Una volta convertito in un numero int, qualsiasi può essere convertito in una stringa di formato.
Il riempimento zero ei prefissi possono essere controllati dalla stringa della specifica di formattazione.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011