Le binaire, l'octal et l'hexadécimal (aussi appelé hex) sont différents systèmes de numération avec des bases différentes. Le binaire est en base 2, l'octal en base 8 et l'hexadécimal en base 16. En Python, les entiers ordinaires sont en base 10. Le binaire, l'octal et l'hexadécimal sont tous des représentations d'entiers. Ce qui signifie qu'ils représentent des nombres positifs et négatifs (y compris zéro) sans fractions ni décimales, et qu'ils prennent en charge toutes les opérations que l'on peut faire avec des entiers.
Le binaire est un système de numération en base 2, qui n'utilise que les chiffres 0 et 1. Il représente couramment les états 0 (« éteint ») et 1 (« allumé ») du flux électrique qui traverse les transistors et les interrupteurs des ordinateurs, ainsi que les charges positives et négatives des supports de stockage magnétiques. Le binaire peut représenter tous les entiers que l'on utilise en base 10.
Un extrait du système en base 2 ressemble à ceci, même s'il continue à l'infini et ne s'arrête pas à 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 |
Donc si l'on veut représenter le nombre 6 en binaire, on obtient 110.
| Valeur de position | 4 | 2 | 1 |
|---|---|---|---|
| Nombre binaire | 1 | 1 | 0 |
Et l'opération serait : 4 + 2 + 0 = 6
Un autre exemple : 19
| Valeur de position | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Nombre binaire | 1 | 0 | 0 | 1 | 1 |
Le nombre binaire serait : 10011
Et l'opération serait : 16 + 0 + 0 + 2 + 1 = 19
En Python, on peut représenter des littéraux binaires à l'aide du préfixe 0b.
Si l'on écrit 0b10011, Python l'interprète comme un nombre binaire et le convertit en base 10.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
En Python, le binaire n'est qu'une autre façon d'écrire un entier ; la représentation binaire est donc un entier pour toutes les opérations mathématiques.
Si tu écris un nombre avec le préfixe 0b qui n'appartient pas au système binaire, Python lève une SyntaxError.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Comme les nombres binaires sont des entiers, on peut leur appliquer toutes les opérations que l'on peut faire avec des entiers.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
On peut aussi effectuer des opérations entre une représentation binaire et une représentation entière.
Cependant, les règles habituelles des opérateurs mathématiques s'appliquent : la division de deux nombres binaires ou de deux entiers renvoie un float, même si la division ne donne pas de partie décimale.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
Python convertit automatiquement un littéral binaire en int.
Pour convertir un int en représentation binaire, utilise la fonction intégrée [bin()][bin].
bin() renvoie une str de l'équivalent binaire, avec le préfixe 0b.
>>> bin(19)
'0b10011'
Pour convertir un littéral binaire en entier, on peut utiliser la fonction intégrée int(), en lui passant une string de la représentation binaire et un argument de base :
>>> int("0b10011", 2)
19
Donner une mauvaise base (ou une représentation binaire invalide) lève une 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'
Il existe aussi quelques méthodes particulières que l'on peut utiliser sur les nombres binaires.
<int>.bit_length() renvoie le nombre de bits nécessaires pour représenter le nombre :
>>> 0b11011.bit_length()
5
<int>.bit_count() renvoie le nombre de bits à 1 dans le nombre binaire.
Par exemple, bit_count() appliqué à '0b11011' renvoie 4 :
>>> 0b11011.bit_count()
4
Si tu travailles en local, bit_count() nécessite au moins Python 3.10.
L'éditeur en ligne d'Exercism prend actuellement en charge toutes les fonctionnalités jusqu'à Python 3.11.
L'octal est un système de numération en base 8. Il utilise les chiffres 0, 1, 2, 3, 4, 5, 6 et 7.
En Python, on peut représenter des nombres octaux à l'aide du préfixe 0o.
Comme pour le binaire, Python convertit automatiquement une représentation octale en int.
>>> 0o123
83
Comme pour le binaire, les nombres octaux sont des entiers et prennent en charge toutes les opérations sur les entiers.
Ajouter le préfixe 0o à un nombre qui n'appartient pas au système octal lève une SyntaxError.
Pour convertir un int en représentation octale, tu peux utiliser la fonction intégrée [oct()][oct].
Elle fonctionne comme la fonction bin() et renvoie une string :
>>> oct(83)
'0o123'
Pour convertir un nombre octal en entier, on peut utiliser la fonction int(), en lui passant une string représentant le nombre octal et la base (8) comme arguments :
>>> int("0o123", 8)
83
Comme pour le binaire, donner une mauvaise base lève une ValueError.
L'hexadécimal est un système de numération en base 16. Il utilise les chiffres de 0 à 9 et les lettres A, B, C, D, E et F. A vaut 10, B vaut 11, C vaut 12, D vaut 13, E vaut 14 et F vaut 15.
On peut représenter des nombres hexadécimaux en Python à l'aide du préfixe 0x.
Comme pour le binaire et l'octal, Python convertit automatiquement les littéraux hexadécimaux en int.
>>> 0x123
291
Comme pour le binaire et l'octal, les littéraux hexadécimaux sont des entiers, et tu peux leur appliquer toutes les opérations sur les entiers.
Ajouter le préfixe 0x à un nombre qui n'est pas hexadécimal lève une SyntaxError.
Pour convertir un int en représentation hexadécimale, tu peux utiliser la fonction intégrée [hex()][hex].
Elle fonctionne comme la fonction bin() et renvoie une string :
>>> hex(291)
'0x123'
Pour convertir une représentation hexadécimale en entier, on peut utiliser la fonction int(), en lui passant une string hexadécimale et la base (16) comme arguments :
>>> int("0x123", 16)
291
Comme pour le binaire et l'octal, donner une mauvaise base lève une ValueError.