Convertire numeri binari, ottali ed esadecimali e stringhe da e verso l’altro in Python

Attività commerciale

Python può gestire numeri e stringhe come numeri binari, ottali ed esadecimali, oltre ai soliti numeri decimali. È anche facile convertire tra loro.

In questa sezione, i seguenti contenuti saranno spiegati insieme al codice di esempio.

  • Scrivere numeri interi in binario, ottale ed esadecimale.
  • Convertire numeri in stringhe in notazione binaria, ottale ed esadecimale.
    • funzione incorporata (per esempio nel linguaggio di programmazione)bin(),oct(),hex()
    • metodo della stringastr.format(), Funzioni integrateformat(), f stringa
    • Converte un intero negativo in una stringa nel formato complemento a due.
  • Convertire stringhe in notazione binaria, ottale ed esadecimale in numeri.
    • funzione incorporata (per esempio nel linguaggio di programmazione)int()
  • Esempi di applicazioni
    • Aritmetica delle stringhe binarie
    • Convertire tra numeri binari, ottali ed esadecimali

Scrivere numeri interi in binario, ottale ed esadecimale.

Aggiungendo i seguenti prefissi, i numeri interi int possono essere scritti rispettivamente in binario, ottale ed esadecimale.
Puoi anche usare le lettere maiuscole.

  • Numero binario:0bo0B
  • Ottale:0oo0O
  • Numero esadecimale:0xo0X

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

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

Anche con il 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'>

Dato che è un tipo intero, può essere usato per operazioni aritmetiche regolari.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

A partire da Python 3.6, è possibile inserire underscore _ nei numeri. Ripetere un underscore _ risulterà in un errore, ma potete inserirne quanti ne volete, purché non lo ripetiate.

Il _ underscore non influenza il numero, quindi può essere usato come separatore quando ci sono molte cifre. Per esempio, inserendo un underscore _ ogni quattro cifre è facile da leggere.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Convertire numeri in stringhe in notazione binaria, ottale ed esadecimale.

Per convertire un numero in una stringa in notazione binaria, ottale o esadecimale, usate le seguenti funzioni integrate.

  • funzione incorporata (per esempio nel linguaggio di programmazione)bin(),oct(),hex()
  • metodo della stringastr.format(), Funzioni integrateformat(), f stringa

Questa sezione spiega anche come ottenere una stringa espressa in formato complemento a due per valori negativi.

Funzioni integrate bin(), oct(), hex()

Le seguenti funzioni integrate possono convertire i numeri in stringhe binarie, ottali ed esadecimali.

  • Numero binario:bin()
  • Ottale:oct()
  • Numero esadecimale:hex()

Ognuno restituisce una stringa con i seguenti prefissi

  • Numero binario:0b
  • Ottale:0o
  • Numero esadecimale:0x
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 avete bisogno del prefisso, usate slice[2:] per estrarre la stringa dietro di esso, o usate format() come spiegato in seguito.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

Se volete convertirlo in una stringa decimale, potete usare str().

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

Funzione incorporata format(), metodo str.format(), f string

La funzione built-in format() e i metodi str.format() e f-string possono anche convertire i numeri in stringhe binarie, ottali ed esadecimali.

Specificando il secondo argomento di format() come segue, può essere convertito in stringhe binarie, ottali ed esadecimali, rispettivamente.

  • Numero binario:b
  • Ottale:o
  • Numero esadecimale:x
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 volete ottenere una stringa con prefisso 0b,0o,0x, aggiungete # alla stringa delle specifiche di formattazione.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

È anche possibile riempire lo 0 con qualsiasi numero di cifre. Si noti che il numero di caratteri per il prefisso (due caratteri) deve anche essere preso in considerazione quando si compila lo 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 str.format() può essere usato anche per la conversione.

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

A partire da Python 3.6, potete anche usare la stringa f.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

Converte un intero negativo in una stringa nel formato complemento a due.

Quando un intero negativo viene convertito in una stringa binaria o esadecimale usando bin() o format(), il valore assoluto avrà un segno meno.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

In Python, le operazioni bitwise sugli interi negativi vengono eseguite anche nella rappresentazione del complemento a due. Pertanto, se volete ottenere una stringa espressa in forma di complemento a due, potete fare un OR& logico bitwise con il numero massimo di cifre di bit richiesto, come segue.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

Convertire stringhe in notazione binaria, ottale ed esadecimale in numeri.

Funzione incorporata int()

Per convertire una stringa in notazione binaria, ottale o esadecimale in un numero, usate la funzione integrata int().

Con int(string, radix), una stringa str in notazione binaria, ottale, esadecimale, ecc. può essere convertita in un int numerico basato sul radix. Se il radix è omesso, il numero è considerato 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 il radix è impostato a 0, la conversione è fatta in base al seguente prefisso di stringa.

  • Prefisso binario:0bo0B
  • Prefisso ottale:0oo0O
  • Prefisso esadecimale:0xo0X
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

Se il numero base è 0 e non c'è prefisso, sarà convertito come numero decimale, ma si noti che se l'inizio (lato sinistro) è riempito con 0, si verificherà un errore.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

In altri casi, le stringhe riempite con zero possono essere convertite così come sono.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

Se la stringa non può essere convertita con il radix o il prefisso specificato, si verifica un errore.

# 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 applicazioni

Aritmetica delle stringhe binarie

Ad esempio, per eseguire un'operazione su una stringa in notazione binaria con il prefisso 0b.

Potete facilmente convertirlo in un valore numerico (tipo intero int), eseguire operazioni su di esso, e poi convertirlo di nuovo in una stringa str.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

Convertire tra numeri binari, ottali ed esadecimali

È anche facile convertire stringhe binarie, ottali ed esadecimali tra loro. Una volta convertito in un int numerico, può essere convertito in una stringa di qualsiasi formato.

Il riempimento a zero, il prefisso, ecc. possono essere controllati dalla stringa di specificazione della formattazione.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011