Utilisation des bases 8 et 16 en informatique

Pourquoi utiliser la base 8 (octale) ?

Les informaticiens ont beaucoup utilisé historiquement les nombres écrits en base 8 (donc n’utilisant que les chiffres de 0 à 7) car il faut exactement 3 bits pour coder un nombre compris entre 0 et 7: cela permettait de regrouper les bits par paquets de 3.

Par exemple, le nombre 113 s'écrit 1110001 en binaire. En regroupant les bits par paquets de 3 (en partant du bit de poids faible, c’est-à-dire le plus à droite), on obtient (001)(110)(001), où on a rajouté 2 zéros à gauche pour compléter. Chaque paquet de 3 bits, pris séparément, correspond à un chiffre entre 0 et 7: ici, le nombre 113 s'écrit en octal 161.

On peut le vérifier en python:

>>> oct(113)
'0o161'

On constate que la représentation d’un nombre octal en python est préfixée par 0o, ce qui est cohérent avec le préfixe 0b pour le binaire.

Inversement, si on considère le nombre \(715_8\), il est aisé de le convertir en décimal. Deux solutions s’offrent à nous:

  • On utilise la formule \[715_8 = 7\times 8^2 + 1\times 8^1 + 5\times 8 = 461\]
  • On passe par le binaire: chaque chiffre octal nous donne un paquet de 3 bits: \[715_8 = (111)(001)(101)_2 = 461\] Cela nécessite une étape supplémentaire (conversion du binaire vers le décimal), mais les calculs sont bien plus aisé à réaliser à la main.

De nos jours, la base octale n’est plus guère utilisée en informatique, bien qu’on en trouve des traces. L’idée sous-jacente est cependant excellente: regrouper des bits par paquets faciles à compter à la main.

Il est naturel d’imaginer un regroupement de bits plus propice à l’informatique (où on a à gérer des octets, des mots sur 16, 32 ou 64 bits): on regroupe alors naturellement les bits par paquets de 4, ce qui nous amène à la notion d’hexadécimal.

Les nombres hexadécimaux

En hexadécimal, on regroupe les bits par paquets de 4. Il y a donc \(2^4 = 16\) chiffres possibles. Les 10 premiers chiffres seront naturellement notés de 0 à 9, mais pour les 6 chiffres suivants, on convient d’utiliser les 6 premières lettres de l’alphabet (en majuscule ou en minuscule, peu importe).

Ainsi, il y aura 6 chiffres supplémentaires, dont les valeurs iront de 0 à 15:

Chiffre Valeur Binaire
A 10 1010
B 11 1011
C 12 1100
D 13 1101
E 14 1110
F 15 1111

Nous n’avons pas représenté les 10 chiffres allant de 0 à 9 puisque leur valeur est évidente.

Reprenons l’entier (en base 10) 113, dont la représentation binaire est 1110001. En regroupant les bits par paquets de 4, on aura: \[113 = 1110001_2 = \underbrace{0111}_{= 7},\underbrace{0001}_{ = 1}{}_2 = 71_{16}\]

Un autre exemple: Considérons le nombre 51042. On aura alors, après l’avoir converti en binaire: \[51,042 = \underbrace{1100}_{= C} , \underbrace{0111}_{= 7} , \underbrace{0110}_{= 6} , \underbrace{0010}_{= 2}{}_2 = \text{C}7,62_{16}\]

Inversement, si on considère le nombre dont la représentation en base 16 est \(\text{FEED}\), il suffit d’en déduire les paquets de 4 bits pour ensuite reconvertir vers un nombre décimal: \[\text{FE},\text{ED}_{16} = \overbrace{1111}^{= F} , \overbrace{1110}^{= E} , \overbrace{1110}^{= E} , \overbrace{1101}^{= D}{}_2 = 65,261\]

Conversion entre représentations décimales et hexadécimales

Dans le paragraphe précédent, nous avons systématiquement utilisé une représentation binaire comme représentation intermédiaire, pour deux raisons:

  • Passer de l’hexadécimal au binaire (et inversement) est on ne peut plus simple, comme nous venons de le voir;
  • Convertir du décimal vers le binaire (et inversement) est plus facile à réaliser de tête (pour un humain) que la conversion directe décimal \(\leftrightarrow\) hexadécimal, comme nous allons le voir à présent:

Conversion du décimal vers l’hexadécimal

Un point important à réaliser: les algorithmes dépendent très peu des bases utilisées. Convertir depuis et vers l’hexadécimal est presque la même chose que convertir depuis et vers le binaire. Seule la base change.

Voici un algorithme efficace pour déterminer la représentation hexadécimale d’un nombre \(N\):

N est un entier naturel
Tant que N > 0 faire:
    Afficher le chiffre hexadécimal de valeur N % 16
    N ← N // 16

Tout comme l’algorithme équivalent pour le binaire, les chiffres sont affichés de la droite vers la gauche (du poids le plus faible vers le poids le plus fort). Il est aisé de corriger cela à l’aide des chaînes de caractères python (nous verrons comment faire en TP).

Conversion de l’hexadécimal vers le décimal

Voici un algorithme prenant en entrée une chaîne de caractères contenant uniquement des chiffres hexadécimaux

H est une chaîne de caractères ne contenant que des chiffres hexadécimaux
N ← 0
Pour car parcourant les caractères de H:
    val ← valeur hexadécimale de car
    N ← 16*N + val