Codage de l'information
Introduction :
Nous l’avons vu dans le cours précédent, les conversions des signaux prennent une place prépondérante dans une chaîne d’information. Ainsi, pour comprendre le processus de numérisation d’une information, il nous faut comprendre comment fonctionne le codage d’une information.
Les ordinateurs, constitués de circuits logiques, ne connaissent que le système binaire, en base $2$.
Dans ce cours, nous allons découvrir ce qu’est une base de numération et étudier celle de $2$ et $16$, omniprésentes en informatique. Nous allons aussi apprendre comment passer de l’une à l’autre.
Bases de numération
Bases de numération
Nous sommes habitués à compter en base $10$, notamment parce que l’homme a $10$ doigts et que c’est pratique, tout de même, de compter sur ses doigts !
L’ordinateur, lui, n’a pas de doigts, mais des circuits logiques qui ne connaissent que $2$ chiffres ($0$ ou $1$).
- En réalité, il existe une infinité de bases pour compter.
D’ailleurs, vous connaissez déjà la base $60$ : elle sert pour les angles (un tour complet de $360\degree$) ou, de manière approchée, pour la mesure du temps ($1\ \text{h}=60\ \text{min}=60\times60\ \text{s}$).
- Pour faciliter la compréhension, nous ne traiterons que les nombres entiers, sans partie décimale.
Considérons une base $s$ (avec $s$ entier $>1$). Alors l’écriture générale d’un nombre de $(n+1)$ chiffres est, dans cette base :
$$\begin{aligned} \red{a_n} \blue{a_{n-1}}… \purple{a_1} \green{a_0} &= \red{a_n} \times s^n + \blue{a_{n-1}} \times s^{n-1} + … + \purple{a_1} \times s^1+ \green{a_0} \times s^0 \\ &= \displaystyle\sum_{i=0}^n a_i\times s^i \end{aligned}$$
Avec, pour tout $i$ de $0$ à $n$, $a_i$ un chiffre de la base $s$.
L’écriture littérale ci-dessus peut sembler complexe.
Mais regardons ce que cela donne en base $10$, car on sait facilement développer un nombre entier en puissances de $10$.
$$\begin{aligned} \red7\,\blue 0\purple 6\green 5&=7\times1\,000+0\times100+6\times10+5\times1 \\ &=\red7\times10^3+\blue0\times10^2+\purple6\times10^1+\green5\times10^0 \end{aligned}$$
Cela correspond très exactement à la formule donnée plus haut, avec :
- $s=10$ ;
- $n=3$ ;
- $a_3=7$ ;
- $a_2=0$ ;
- $a_1=6$ ;
- $a_0=5$.
- C’est évident en base $10$, et c’est la même chose en base quelconque $s$. Avec un peu de pratique, cela vous deviendra donc tout aussi évident !
Lorsqu’on manipule des nombres dans des bases différentes et qu’il peut y avoir ambiguïté, il est important de préciser dans quelle base ces nombres sont exprimés.
- Nous choisissons ici de mettre la base en indice, après le nombre concerné : $N_s$.
- On considère qu’un nombre donné sans précision supplémentaire (sans indice) est exprimé en base $10$.
Base binaire et base hexadécimale
Base binaire et base hexadécimale
Étudions tout d’abord la base utilisée par les ordinateurs : la base binaire.
Nombre binaire
Nombre binaire
Nombre binaire :
Un nombre binaire s’écrit avec $2$ chiffres, $0$ et $1$.
Dans une base décimale, pour passer d’un nombre à un autre, nous ajoutons $1$. Lorsque nous atteignons $9$, nous repartons de $0$ pour les unités et incrémentons la dizaine (et ainsi de suite pour les centaines, milliers, etc.) :
$$\begin{aligned} \ \textcolor{#808080} 0\textcolor{#808080}0 9\ &^{\underrightarrow{\ {+1}\ }}\ \textcolor{#808080}0 \red 1 \green 0 \\ \ \textcolor{#808080} 0 99\ &^{\underrightarrow{\ {+1}\ }}\ \red1\green0\green0 \end{aligned}$$
- Il en va de même en base binaire, sauf que nous ne pouvons aller au-delà de $1$ :
$$\textcolor{#808080}0 \textcolor{#808080}0 0_{\tiny 2}\ ^{\underrightarrow{\ {+1}\ }}\ \textcolor{#808080}0 \textcolor{#808080} 0 \red 1_{\tiny 2} \ ^{\underrightarrow{\ {+1}\ }}\ \textcolor{#808080}0 \red1 \green0_{\tiny 2} \ ^{\underrightarrow{\ {+1}\ }}\ \textcolor{#808080}0 1 \red1_{\tiny 2}\ ^{\underrightarrow{\ {+1}\ }}\ \red1 \green0 \green0_{\tiny 2} \ ^{\underrightarrow{\ {+1}\ }}\ 10\red1_{\tiny 2}\ …$$
Nous appellerons la base binaire ci-dessus décrite « naturelle ». Il existe d’autres codes binaires, que nous découvrirons plus loin dans ce cours.
Base binaire et bit
Base binaire et bit
$1$ bit (binary digit) ne peut prendre que $2$ valeurs : $0$ ou $1$.
- D'une manière générale, avec $N$ bits, on représente $2^N$ nombres.
Généralement, on regroupe les bits par $4$.
- $1$ quartet est un groupe de $4$ bits.
- $1$ octet ($\text{o}$) est un groupe de $8$ bits.
- $1$ mot est un groupe de $16$ bits.
- $1$ double mot est un groupe de $32$ bits.
On identifie les premier et dernier bits par des noms :
- celui le plus à droite est le bit de poids faible, noté $\text{LSB}$ (Least Significant Bit) ;
- celui le plus à gauche est le bit de poids fort, noté $\text{MSB}$ (Most Significant Bit) ;
Pour ôter toute ambiguïté sur les préfixes des multiples d’octets ($1\ \text{kilo}=1\,000$ n’étant pas une puissance de $2$), il est désormais préconisé, dans le Système international, d’utiliser les préfixes :
- kibioctets ($\text{Kio}$) pour $2^{10}=1\,024\ \text{o}$ ;
- mébioctets ($\text{Mio}$) pour $2^{20}=1\,024\ \text{Kio}=1\,048\,576\ \text{o}$ ;
- et ainsi de suite pour le gibioctets ($\text{Gio}$), le tébioctets ($\text{Tio}$), etc.
Donnons maintenant un tableau d’équivalences pour des nombres codés en $4$ bits (soit $16$ valeurs) :
Codes particuliers
Codes particuliers
- Code DCB
Le code DCB (« décimal codé binaire ») permet une relation assez directe entre la base décimale et la base binaire.
Un nombre décimal se décompose en unités, dizaines, centaines, milliers, etc.
- Avec le code DCB, chaque chiffre décimal est représenté par un quartet.
Un nombre $N$ codé en DCB sera noté : $N_{\tiny{\text{DCB}}}$.
Codons $7\,065$ en DCB :
$$\underbrace{\large{\red {7}}}_{\large{\red{\ 0111\ }}} \underbrace{\large {\blue{0}}}_{\large{\blue{\ 0000\ }}} \underbrace{\large {\purple{6}}}_{\large{\purple{\ 0110\ }}} \underbrace{\large {\green{5}}}_{\large{\green{\ 0101\ }}}$$
Ainsi : $7\,065_{\tiny 10}=0111\,0000\,0110\,0101_{\tiny{\text{DCB}}}$.
Nous voyons tout de suite un désavantage de ce code : il faut plus de bits pour représenter un même nombre décimal. En effet, pour coder, par exemple, $12$, il faut $1$ octet en DCB quand $1$ quartet suffit en code binaire naturel.
- Toutefois, le DCB est très répandu en électronique, notamment lorsqu’il s’agit d’afficher des valeurs numériques : il permet un traitement simplifié et n’a pas besoin de l’interface complexe que nécessiterait l’utilisation de codes binaires naturels.
- Code binaire réfléchi
Nous l’avons vu plus haut, dans le code binaire naturel, on ajoute $1$ pour passer d’un nombre à un autre.
Le code binaire réfléchi, ou code Gray, en diffère en ce qu’il interdit la modification de plus de $1$ chiffre lors de ce passage.
- Lorsqu’un nombre est incrémenté d’une unité, un seul bit change.
- Changer un seul chiffre à la fois permet d’éviter toute valeur intermédiaire fausse.
En code binaire naturel, on a : $0\red0\purple1\ ^{\underrightarrow{\ {+1}\ }}\ 0\purple1\red0$. Nous voyons que les $2$ derniers chiffres changent.
- Si, dans un circuit logique, les $2$ chiffres ne sont pas modifiés exactement au même moment, alors il y aura un instant où la valeur sera fausse ($000$ ou $011$).
En code binaire réfléchi, on a : $0\red0 1\ ^{\underrightarrow{\ {+1}\ }}\ 0\purple1 1$. Ici, seul le deuxième chiffre change.
- Il n’y a donc aucune possibilité de valeur intermédiaire.
Nombre hexadécimal
Nombre hexadécimal
Il nous est compliqué de manipuler la base binaire. Et le passage de la base binaire à la base décimale n’est pas directe.
- Une autre base s’est donc avérée nécessaire, permettant d’avoir une correspondance plus directe avec la base binaire : la base hexadécimale, soit une base de $16$.
Nombre hexadécimal :
Un nombre hexadécimal s’écrit avec $16$ chiffres, de $0$ et $9$, puis de $\text{A}$ à $\text{F}$.
Ici aussi, pour passer d’un nombre au suivant, on ajoute $1$ :
$$00\ ^{\underrightarrow{\ {+1}\ }}\ 01\ …\ 09\ ^{\underrightarrow{\ {+1}\ }}\ 0 \text{A}\ ^{\underrightarrow{\ {+1}\ }}\ 0 \text{B}\ …\ 0 \text{F}\ ^{\underrightarrow{\ {+1}\ }}\ 10\ ^{\underrightarrow{\ {+1}\ }}\ 11\ …\ 1 \text{F}\ ^{\underrightarrow{\ {+1}\ }}\ 20\ …$$
Conversion entre bases
Conversion entre bases
Nous savons maintenant ce que sont les bases de numération. Ce qui nous intéresse tout particulièrement, c’est la façon de passer d’une base à une autre, c’est-à-dire de convertir une valeur donnée dans une base en une valeur exprimée dans une base différente.
Conversion binaire $\leftrightarrow$ décimal
Conversion binaire $\leftrightarrow$ décimal
- Conversion binaire $\rightarrow$ décimal
Dans la première partie, nous avons vu qu’un nombre en base $s$ pouvait s’exprimer sous la forme d’une somme de puissances de $s$.
- Cela fonctionne donc en base $2$.
Pour convertir un nombre binaire en un nombre décimal, il suffit d’écrire le nombre binaire sous la forme d’une somme de puissances de $2$, puis de faire l’opération.
$$\begin{aligned} \red 1 \blue 0\purple 1\green1_{\tiny 2}&=\red 1\times2^3+\blue 0\times2^2+\purple1\times2^1+\green1\times2^0 \\ &=11_{\tiny 10} \end{aligned}$$
- Conversion décimal $\rightarrow$ binaire
Pour convertir un nombre décimal en un nombre binaire, il faut réaliser une succession de divisions euclidiennes par $2$, jusqu’à obtenir un quotient égal à $0$.
Le nombre binaire sera la succession des restes, en partant de celui de la dernière division, jusqu’à celui de la première. Autrement dit :
- le bit de poids faible sera le reste de la première division euclidienne ;
- le bit de poids fort sera le reste de la dernière division euclidienne.
Exprimons en binaire le nombre décimal $77$.
- Ainsi : $77_{\tiny 10}=100\,1101_{\tiny 2}$
Conversion hexadécimal $\leftrightarrow$ binaire
Conversion hexadécimal $\leftrightarrow$ binaire
Nous l’avons dit plus haut : nous faisons appel à la base $16$ car les correspondances hexadécimal $\leftrightarrow$ binaire sont plus directes.
- Les conversions, dans un sens comme dans l’autre, se font donc de manière simple.
Regardons déjà le tableau d’équivalences entre les $16$ chiffres utilisés en hexadécimal et leur valeur binaire (avec $4$ bits, puisqu’il faut $4$ bits pour coder $2^4=16$ nombres) :
- Conversion hexadécimal $\rightarrow$ binaire
Pour convertir un nombre hexadécimal en un nombre binaire, il suffit de donner la correspondance en binaire, sur un quartet, de chaque chiffre.
Exprimons en binaire le nombre hexadécimal $3 \text{D} \text{F} 7$.
$$\underbrace{\large{\red {3}}}_{\large{\red{\ 0011\ }}} \underbrace{\large {\blue{\text{D}}}}_{\large{\blue{\ 1101\ }}} \underbrace{\large {\purple{\text{F}}}}_{\large{\purple{\ 1111\ }}} \underbrace{\large {\green{7}}}_{\large{\green{\ 011 1\ }}}$$
- Ainsi : $3 \text{D} \text{F} 7_{\tiny 16}=0011\,1101\,1111\,0111_{\tiny 2}$
- Conversion binaire $\rightarrow$ hexadécimal
Pour convertir un nombre binaire en un nombre hexadécimal, il faut d’abord grouper le nombre binaire par quartets, en partant du bit de poids faible. Ensuite, il suffit de donner la correspondance de chaque quartet en hexadécimal.
Exprimons en hexadécimal le nombre binaire $11110111110111$.
On regroupe par quartet, en ajoutant deux $0$ sur les deux bits les plus à gauche pour compléter le dernier quartet : $0011\,1101\,1111\,0111$.
Puis on met les correspondances :
$$\underbrace{\large{\red {0011}}}_{\large{\red{3}}}\ \underbrace{\large {\blue{1101}}}_{\large{\blue{\text D}}}\ \underbrace{\large {\purple{1111}}}_{\large{\purple{\text F}}}\ \underbrace{\large {\green{0111}}}_{\large{\green{7}}}$$
- Ainsi : $0011\,1101\,1111\,0111_{\tiny 2}=3 \text{D} \text{F} 7_{\tiny 16}$
Conversion hexadécimal $\leftrightarrow$ décimal
Conversion hexadécimal $\leftrightarrow$ décimal
Pour commencer, donnons le tableau d’équivalences des $16$ premiers nombres, soit de $0$ à $\text{F}$, en décimal :
Hexadécimal | $00$ | $01$ | $02$ | $03$ | $04$ | $05$ | $06$ | $07$ | $08$ | $09$ | $0\text A$ | $0\text B$ | $0\text C$ | $0\text D$ | $0\text E$ | $0\text F$ |
Décimal | $00$ | $01$ | $02$ | $03$ | $04$ | $05$ | $06$ | $07$ | $08$ | $09$ | $10$ | $11$ | $12$ | $13$ | $14$ | $15$ |
- Conversion hexadécimal $\rightarrow$ décimal
Nous utilisons la même propriété que pour la conversion binaire $\rightarrow$ décimal.
Pour convertir un nombre hexadécimal en un nombre décimal, il suffit d’écrire le nombre hexadécimal sous la forme d’une somme de puissances de $16$, puis de faire l’opération.
- Il conviendra bien sûr, pour les lettres, de les convertir dans le nombre décimal correspondant.
$$\begin{aligned} \red 3 \blue {\text{D}}\purple {\text{F}}\green7_{\tiny 16}&=\red 3\times16^3+\blue {D}\times16^2+\purple{F}\times16^1+\green7\times2^0 \\ &=\red 3\times16^3+\blue {13}\times16^2+\purple{15}\times16^1+\green7\times2^0 \\ &=15\,863 \end{aligned}$$
- Conversion décimal $\rightarrow$ hexadécimal
Pour convertir un nombre décimal en un nombre hexadécimal, il faut réaliser une succession de divisions euclidiennes par $16$, jusqu’à obtenir un quotient égal à $0$.
Le nombre hexadécimal sera la succession des restes, en partant de celui de la dernière division, jusqu’à celui de la première.
- Il conviendra bien sûr, si le reste est supérieur ou égal à $10$, de le convertir dans la lettre correspondante.
Exprimons en hexadécimal le nombre décimal $77$.
- Ainsi : $77_{\tiny 10}=4 \text{D}_{\tiny 16}$
Diviser par $16$, ou calculer les puissances de $16$, peut s’avérer difficile.
- Ainsi, il est parfois plus simple, lors d’une conversion hexadécimal $\rightarrow$ décimal ou inversement, de convertir d’abord en binaire, avant de passer dans la base voulue.
Conclusion :
Nous venons de voir les bases de numération, tout particulièrement celles qui servent en informatique et en électronique : les bases binaire et hexadécimale.
Avant d’en voir des applications concrètes, grâce aux opérateurs logiques et à l’algèbre de Boole que nous découvrirons dans les cours suivants, donnons un tableau récapitulatif avec les $21$ premières valeurs.
Décimal | Hexadécimal | Binaire | Binaire BCD | Binaire réfléchi |
$\textcolor{#a4a4a3}{0} 0$ | $\textcolor{#808080}0 0$ | $\textcolor{#808080}{0\,000}0$ | $\textcolor{#808080}{0000}\,0000$ | $\textcolor{#808080}{0\,000}0$ |
$\textcolor{#808080}0 1$ | $\textcolor{#808080}0 1$ | $\textcolor{#808080}{0\,000}1$ | $\textcolor{#808080}{0000}\,0001$ | $\textcolor{#808080}{0\,000}1$ |
$\textcolor{#808080}0 2$ | $\textcolor{#808080}0 2$ | $\textcolor{#808080}{0\,00}10$ | $\textcolor{#808080}{0000}\,0010$ | $\textcolor{#808080}{0\,00}11$ |
$\textcolor{#808080}0 3$ | $\textcolor{#808080}0 3$ | $\textcolor{#808080}{0\,00}11$ | $\textcolor{#808080}{0000}\,0011$ | $\textcolor{#808080}{0\,00}10$ |
$\textcolor{#808080}0 4$ | $\textcolor{#808080}0 4$ | $\textcolor{#808080}{0\,0}100$ | $\textcolor{#808080}{0000}\,0100$ | $\textcolor{#808080}{0\,0}110$ |
$\textcolor{#808080}0 5$ | $\textcolor{#808080}0 5$ | $\textcolor{#808080}{0\,0}101$ | $\textcolor{#808080}{0000}\,0101$ | $\textcolor{#808080}{0\,0}111$ |
$\textcolor{#808080}0 6$ | $\textcolor{#808080}0 6$ | $\textcolor{#808080}{0\,0}110$ | $\textcolor{#808080}{0000}\,0110$ | $\textcolor{#808080}{0\,0}101$ |
$\textcolor{#808080}0 7$ | $\textcolor{#808080}0 7$ | $\textcolor{#808080}{0\,0}111$ | $\textcolor{#808080}{0000}\,0111$ | $\textcolor{#808080}{0\,0}100$ |
$\textcolor{#808080}0 8$ | $\textcolor{#808080}0 8$ | $\textcolor{#808080}{0\,}1000$ | $\textcolor{#808080}{0000}\,1000$ | $\textcolor{#808080}{0\,}1100$ |
$\textcolor{#808080}0 9$ | $\textcolor{#808080}0 9$ | $\textcolor{#808080}{0\,}1001$ | $\textcolor{#808080}{0000}\,1001$ | $\textcolor{#808080}{0\,}1101$ |
$10$ | $\textcolor{#808080}0 \text A$ | $\textcolor{#808080}{0\,}1010$ | $0001\,0000$ | $\textcolor{#808080}{0\,}1111$ |
$11$ | $\textcolor{#808080}0 \text B$ | $\textcolor{#808080}{0\,}1011$ | $0001\,0001$ | $\textcolor{#808080}{0\,}1110$ |
$12$ | $\textcolor{#808080}0 \text C$ | $\textcolor{#808080}{0\,}1100$ | $0001\,0010$ | $\textcolor{#808080}{0\,}1010$ |
$13$ | $\textcolor{#808080}0 \text D$ | $\textcolor{#808080}{0\,}1101$ | $0001\,0011$ | $\textcolor{#808080}{0\,}1011$ |
$14$ | $\textcolor{#808080}0 \text E$ | $\textcolor{#808080}{0\,}1110$ | $0001\,0100$ | $\textcolor{#808080}{0\,}1001$ |
$15$ | $\textcolor{#808080}0 \text F$ | $\textcolor{#808080}{0\,}1111$ | $0001\,0101$ | $\textcolor{#808080}{0\,}1000$ |
$16$ | $10$ | $1\,0000$ | $0001\,0110$ | $1\,1000$ |
$17$ | $11$ | $1\,0001$ | $0001\,0111$ | $1\,1001$ |
$18$ | $12$ | $1\,0010$ | $0001\,1000$ | $1\,1011$ |
$19$ | $13$ | $1\,0011$ | $0001\,1001$ | $1\,1010$ |
$20$ | $14$ | $1\,0100$ | $0010\,0000$ | $1\,1110$ |