Il sistema binario, il sistema ottale e il sistema esadecimale (noto anche come hex) sono sistemi numerici diversi con basi diverse. Il binario è in base 2, l'ottale è in base 8 e l'esadecimale è in base 16. I normali numeri interi sono in base 10 in Python. Il binario, l'ottale e l'esadecimale sono tutte rappresentazioni di numeri interi. Ciò significa che rappresentano numeri positivi e negativi (incluso lo zero) senza frazioni o decimali, e supportano tutte le operazioni che possiamo fare con i numeri interi.
Il binario è un sistema numerico in base 2, che usa solo le cifre 0 e 1. Rappresenta comunemente gli stati 0 («spento») e 1 («acceso») del flusso elettrico attraverso transistor e interruttori nei computer, così come le cariche positive e negative nei supporti di memorizzazione magnetica. Il binario può rappresentare tutti i numeri interi che vengono usati in base 10.
Un frammento del sistema in base 2 è questo, anche se continua all'infinito e non si ferma a 128:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
Quindi, se vogliamo rappresentare il numero 6 in binario, sarebbe 110.
| Place value | 4 | 2 | 1 |
|---|---|---|---|
| Binary number | 1 | 1 | 0 |
E l'operazione sarebbe: 4 + 2 + 0 = 6
Un altro esempio: 19
| Place value | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Binary number | 1 | 0 | 0 | 1 | 1 |
Il numero binario sarebbe: 10011
E l'operazione sarebbe: 16 + 0 + 0 + 2 + 1 = 19
In Python, possiamo rappresentare i letterali binari usando il prefisso 0b.
Se scriviamo 0b10011, Python lo interpreterà come un numero binario e lo convertirà in base 10.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
In Python, il binario è solo un modo diverso di scrivere un numero intero, quindi la rappresentazione binaria è un numero intero per tutte le operazioni matematiche.
Se scrivi un numero con il prefisso 0b che non appartiene al sistema binario, verrà generato un SyntaxError.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Dato che i numeri binari sono numeri interi, possiamo eseguire su di essi tutte le operazioni che possiamo fare con i numeri interi.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
Possiamo anche eseguire operazioni tra rappresentazioni binarie e rappresentazioni intere.
Tuttavia, valgono le solite regole degli operatori matematici: dividere due numeri binari o due numeri interi restituirà un float, anche se la divisione non produce una parte decimale.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
Python converte automaticamente un letterale binario in un int.
Per convertire un int in una rappresentazione binaria, usa la funzione integrata [bin()][bin].
bin() restituirà una str dell'equivalente binario con il prefisso 0b.
>>> bin(19)
'0b10011'
Per convertire un letterale binario in un numero intero, possiamo usare la funzione integrata int() e passare una stringa della rappresentazione binaria e l'argomento base:
>>> int("0b10011", 2)
19
Se si fornisce la base sbagliata (o una rappresentazione binaria non valida), verrà generato un ValueError:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
Ci sono anche alcuni metodi speciali che possiamo usare sui numeri binari.
<int>.bit_length() restituisce il numero di bit necessari per rappresentare il numero:
>>> 0b11011.bit_length()
5
<int>.bit_count() restituisce il numero di uni nel numero binario.
Per esempio, bit_count() su '0b11011' restituisce 4:
>>> 0b11011.bit_count()
4
Se lavori in locale, bit_count() richiede almeno Python 3.10.
L'attuale editor online di Exercism supporta tutte le funzionalità fino a Python 3.11.
L'ottale è un sistema numerico in base 8. Usa le cifre 0, 1, 2, 3, 4, 5, 6 e 7.
In Python, possiamo rappresentare i numeri ottali usando il prefisso 0o.
Come per il binario, Python converte automaticamente una rappresentazione ottale in un int.
>>> 0o123
83
Come per il binario, i numeri ottali sono int e supportano tutte le operazioni sui numeri interi.
Se si antepone 0o a un numero che non appartiene al sistema ottale, verrà generato un SyntaxError.
Per convertire un int in una rappresentazione ottale, puoi usare la funzione integrata [oct()][oct].
Funziona in modo simile alla funzione bin(), restituendo una stringa:
>>> oct(83)
'0o123'
Per convertire un numero ottale in un numero intero, possiamo usare la funzione int(), passando come argomenti una stringa con la rappresentazione ottale e la base (8):
>>> int("0o123", 8)
83
Come per il binario, fornire la base sbagliata genererà un ValueError.
L'esadecimale è un sistema numerico in base 16. Usa le cifre da 0 a 9 e le lettere A, B, C, D, E e F. A è 10, B è 11, C è 12, D è 13, E è 14 e F è 15.
Possiamo rappresentare i numeri esadecimali in Python usando il prefisso 0x.
Come per il binario e l'ottale, Python convertirà automaticamente i letterali esadecimali in int.
>>> 0x123
291
Come per il binario e l'ottale, i letterali esadecimali sono int e puoi eseguire con essi tutte le operazioni sui numeri interi.
Se si antepone 0x a un numero non esadecimale, verrà generato un SyntaxError.
Per convertire un int in una rappresentazione esadecimale, puoi usare la funzione integrata [hex()][hex].
Funziona in modo simile alla funzione bin(), restituendo una stringa:
>>> hex(291)
'0x123'
Per convertire una rappresentazione esadecimale in un numero intero, possiamo usare la funzione int(), passando come argomenti una stringa esadecimale e la base (16):
>>> int("0x123", 16)
291
Come per il binario e l'ottale, fornire la base sbagliata genererà un ValueError.