\chapter{Encodages}
\label{chapitre-encodages}

\begin{exointro}{Lycée Raoul Follereau, Nevers}
\begin{questions}
\item Sachant que le binaire 1000001 correspond à la lettre \og A \fg, quel est le binaire correspondant à la lettre \og B \fg{} ?
\item Convertir $\base{75}{10}$ en binaire.
\item Convertir $\base{2001}{10}$ en hexadécimal.
\item Convertir $\base{ABC}{16}$ en binaire.
\end{questions}
\end{exointro}

\section{Historique de l'informatique}

La notion d'informatique est née il y a fort longtemps. Il y a eu beaucoup d'événements qui nous ont menés, petit à petit, à l'informatique telle que nous la connaissons aujourd'hui. En voici, dans un premier temps, un résumé :

\Par\Par

\begin{pspicture}(0,0)(10,-5)
\psline(0,0)(0,-5)
\pscircle*(0,0){4pt} \uput{5mm}[r]{0}(0.5,-0.2){\begin{minipage}{\dimexpr\linewidth-1cm}$-3000$ : l'empereur chinois Fou-Hi adopte comme symbole un octogone contenant les huit premiers nombres sous forme binaire.\end{minipage}}

\pscircle*(0,-1.2){4pt} \uput{5mm}[r]{0}(0.5,-1.2){\begin{minipage}{\dimexpr\linewidth-1cm}$-500$ : apparition de l'\textit{abaque} et du \textit{boulier}, premiers outils de calculs.\end{minipage}}

\pscircle*(0,-2.2){4pt} \uput{5mm}[r]{0}(0.5,-2.4){\begin{minipage}{\dimexpr\linewidth-1cm}$-300$ : le philosophe Aristote définit la notion de \textit{logique}, nécessaire à l'informatique contemporaine.\end{minipage}}

\pscircle*(0,-3.4){4pt} \uput{5mm}[r]{0}(0.5,-3.4){\begin{minipage}{\dimexpr\linewidth-1cm}$820$ : travaux du mathématicien arabe Al-Khwârizmî.\end{minipage}}

\pscircle*(0,-4.4){4pt} \uput{5mm}[r]{0}(0.5,-4.6){\begin{minipage}{\dimexpr\linewidth-1cm}$1000$ : le zéro est inventé en Inde, et importé en occident au Moyen-Âge. Il ne sera définitivement accepté qu'au XIV\ieme siècle.\end{minipage}}
\end{pspicture}

\newpage

\begin{pspicture}(0,-5.4)(10,-11)
\psline(0,-5.4)(0,-10.8)
\pscircle*(0,-5.8){4pt} \uput{5mm}[r]{0}(0.5,-6.8){\begin{minipage}{\dimexpr\linewidth-1cm}$1600$ : l'écossais John Napier invente les logarithmes, qui permettent de ramener les multiplications et les divisions à des additions et des soustractions.\\À la même époque, l'allemand Wilhelm Schickard invente ce qu'il\linebreak appelle une \textit{horloge calculante}, pouvant réaliser des additions,\linebreak soustractions, multiplications et mémorisations des résultats.\end{minipage}}

\pscircle*(0,-8.4){4pt} \uput{5mm}[r]{0}(0.5,-8.6){\begin{minipage}{\dimexpr\linewidth-1cm}$1697$ : introduction du binaire en Europe par le mathématicien Gottfried Leibniz.\end{minipage}}

\pscircle*(0,-9.6){4pt} \uput{5mm}[r]{0}(0.5,-9.8){\begin{minipage}{\dimexpr\linewidth-1cm}$1840$ : Augusta Ada Lovelace pose le principe d'une machine à calculer. Trois années plus tard, elle définit la théorie de la programmation.\end{minipage}}

\pscircle*(0,-10.8){4pt} \uput{5mm}[r]{0}(0.5,-10.8){\begin{minipage}{\dimexpr\linewidth-1cm}$1854$ : George Boole définit la théorie de la logique binaire.\end{minipage}}
\end{pspicture}

Développons certains points de cette chronologie.

\subsection{L'octogone de l'empereur Fou-Hi}

\NathanLiveVideo[\PictoVideo\ Retrouvez plus d'explications sur l'octogone en vidéo.]{octogone de Fou-Hi}{https://media.prepamath.fr/IL1NSIch1CoursFouHi}

\qrset{height=1.1cm,version=5}\rput(-1,0.2){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch1CoursFouHi}}}
\vspace*{-10pt}


La notation binaire est plus ancienne que l'on pourrait l'imaginer... En $-3000$, l'empereur chinois Fou Hi créé un symbole magique que l'on peut considérer comme la première expression d'un codage en binaire, sous forme d'un octogone comportant huit \textit{trigrammes}.

Chaque trigramme est une association de trois signes qui peuvent être soit une bande pleine noire, soit une bande creuse coupée en deux.

Si une bande noire représente 0 et une bande creuse coupée représente 1, on peut compter de 0 à 7 en binaire avec les huit trigrammes, ainsi que le montre la figure suivante.
%\enlargethispage*{\baselineskip}

\Par

\includegraphics{002_002_01-02b}

\vspace*{-9mm}
\begin{center}
\includegraphics{002_002_01-02a}
\end{center}


%Nous avons reporté ici les équivalents des bandes en binaires (par exemple, 3~bandes noires représentent \og 000 \fg, c'est-à-dire le nombre \og 0 \fg, voir paragraphe~3).

%C'est ainsi qu'apparaissent les premiers prémices du binaire.

\subsection{Aristote et la logique}

La logique \textit{aristotélicienne} sera essentielle pour clarifier tout raisonnement déductif, et l'informatique nécessite de tels raisonnements.

\Par

Aristote introduit les \textit{syllogismes}, raisonnements logiques mettant en relation trois propositions. Les deux premières sont appelées \textit{prémisses} et la dernière, obtenue à partir des deux précédentes, est appelée \textit{conclusion}.

\begin{defin}[syllogisme]
Un \textit{syllogisme} est un raisonnement où deux prémisses permettent d'émettre une conclusion.
\end{defin}

\begin{Exemples}
\begin{itemize}
\item \og Tous les hommes sont mortels, or Socrate est un homme donc Socrate est mortel \fg. Ce syllogisme est dû à Aristote lui-même. 

Ici, le premier prémisse est : \og tous les hommes sont mortels \fg; c'est un fait avéré.

Le second prémisse est : \og Socrate est un homme \fg; c'est aussi un fait avéré, qui n'a pas besoin d'être prouvé.

La conclusion est : \og Socrate est mortel \fg; des deux faits avérés cités précédemment, on peut conclure ceci.

\item Toute planète de notre système solaire possède un rayon supérieur à \numprint{2000} kilomètres. Mercure est une planète de notre système solaire. Donc Mercure a un rayon supérieur à \numprint{2000} km.
\end{itemize}
\end{Exemples}

\begin{attention}
Il existe des syllogismes menant à une conclusion déroutante. Le plus connu est le suivant :

\og Tout ce qui est rare est cher. Or, un cheval bon marché est rare. Donc un cheval bon marché est cher. \fg{} 

On appelle cela un \textit{sophisme}.
\end{attention}

\subsection{Al-Khwârizmî}

Al-Khwârizmî, de son vrai nom \textit{Muhammad Ibn Mūsā al-Khuwārizmī} était un savant perse, né dans les années 780. Son nom  latinisé en \textit{Algoritmi} est à l'origine du mot \textit{algorithme}.

\Par

Il est l'auteur d'un ouvrage mathématique, \textit{Kitābu al-mukhtasar fī hisābi al-jabr waal-muqābalah}, considéré comme le premier ouvrage d'algèbre.

Dans ce titre, on distingue la partie \og al-jabr \fg, qui désigne une opération, et qui est à l'origine du mot \og algèbre \fg.

\subsection{L'invention du zéro}

Il est sûrement surprenant de savoir que le chiffre \og 0 \fg{} fut inventé après les chiffres 1, 2, etc., mais c'est le cas. 

Avant son invention, les Indiens n'avaient pas l'utilité de ce nombre (le zéro en tant que chiffre existait déjà depuis l'époque mésopotamienne, mais n'avait pas d'utilité dans les calculs). 

\Par


C'est le mathématicien et astronome indien Brahmagupta qui l'introduisit en tant que nombre dans son ouvrage \textit{Brâhma Siddhânta}. Le mot fut traduit ensuite en arabe par le mot \og sifr \fg, qui désignait le vide, qui donna plus tard le mot \og chiffre \fg.

Le mot \og zéro \fg, quant à lui, vient de l'italien \textit{zephiro}, traduction de \textit{sifr} dans cette langue.

Le zéro fut ensuite introduit en Europe par le mathématicien italien Leonardo\linebreak Fibonacci, et simplifia considérablement les calculs (jusque-là faits à l'aide\linebreak d'abaques, donc peu pratiques).

Quant au symbole \og 0 \fg, il semblerait provenir de la représentation (initialement un cercle) de la voûte céleste.

\subsection{Le binaire et Leibniz}

Gottfried Leibniz, personnage allemand aux multiples talents (mathématiques, philosophie, diplomatie, jurisme, philologie, ...), était passionné par la \textit{Dyadique}, c'est-à-dire par tout ce qui se rapporte à la réunion de deux principes philosophiques qui se complètent réciproquement.

S'interrogeant sur l'utilité d'un système connu des chinois, qui peut se comparer à un système binaire, il expose ses idées à l'Académie des sciences de Paris, et celles-ci furent publiées dans un ouvrage intitulé \textit{Explication de l'arithmétique binaire avec des remarques sur son utilité et sur le sens qu'elle donne des anciennes figures chinoises de Fou-Hi}.

\subsection{Augusta Ada Lovelace}

Augusta Ada Lovelace était la fille du poète romantique Lord George Byron et d'une mathématicienne et féministe, épouse de William King (futur comte de Lovelace). Elle est à l'origine du \og Principe des machines à calculer \fg. Un langage de\linebreak programmation porte son prénom en mémoire de ses travaux.

Pour elle, une machine à calculer doit comporter :
\begin{itemize}
\item un dispositif permettant d'introduire les données numériques (cartes perforées, roues dentées...);
\item une mémoire pour conserver les valeurs numériques entrées;
\item une unité de commande grâce à laquelle l'utilisateur va indiquer à la machine les tâches à effectuer;
\item un \og moulin \fg chargé d'effectuer les calculs;
\item un dispositif permettant de restituer les résultats (imprimante, écran...);
\end{itemize}

Ces principes seront, un siècle plus tard, à la base des premiers ordinateurs.

\Par

Elle définit ensuite le principe d'itérations successives dans l'exécution d'une opération. En l'honneur du mathématicien arabe Al-Khwârizmî, elle appelle \linebreak\og algorithme \fg{} le processus logique permettant l'exécution d'un programme.


\subsection{L'algèbre de Boole}

Dans son ouvrage \textit{Les lois de la pensée}, George Boole explique que l'on peut coder les démarches de la pensée à l'aide de systèmes n'ayant que deux états: ZERO-UN; OUI-NON; VRAI-FAUX, etc. L'algèbre de Boole, ou \textit{calcul booléen}, voit alors le jour.

\Par

Il existe deux types d'opérations dans l'algèbre de Boole.

\begin{prop}[conjonction logique]
Soit $B$ un ensemble fini de deux éléments ($B=\{0~;~1\}$ ou $B=\{\text{faux}~;~\text{vrai}\}$ par exemple). La fonction \og ET \fg{} est définie sur $B$ par le tableau suivant:

\Par

\begin{center}
\begin{tabular}{|>{\columncolor{LY}}Zc|Zc|Zc|}
\hline
\tabulartitle
ET & 0 & 1\\
\hline
0 & 0 & 0\\
\hline
1 & 0 & 1\\
\hline
\end{tabular}
\qquad équivalent à :\qquad
\begin{tabular}{|>{\columncolor{LY}}Zc|Zc|Zc|}
\hline
\tabulartitle
ET & faux & vrai\\
\hline
faux & faux & faux\\
\hline
vrai & faux & vrai\\
\hline
\end{tabular}
\end{center}
\end{prop}


\begin{prop}[disjonction logique]
Soit $B$ un ensemble fini de deux éléments ($B=\{0~;~1\}$ ou $B=\{\text{faux}~;~\text{vrai}\}$ par exemple). La fonction \og OU \fg{} est définie sur $B$ par le tableau suivant:

\Par

\begin{center}
\begin{tabular}{|>{\columncolor{LY}}Zc|Zc|Zc|}
\hline
\tabulartitle
OU & 0 & 1\\
\hline
0 & 0 & 1\\
\hline
1 & 1 & 1\\
\hline
\end{tabular}
\qquad équivalent à :\qquad
\begin{tabular}{|>{\columncolor{LY}}Zc|Zc|Zc|}
\hline
\tabulartitle
OU & faux & vrai\\
\hline
faux & faux & vrai\\
\hline
vrai & vrai & vrai\\
\hline
\end{tabular}
\end{center}
\end{prop}
\label{algebreBoole} %  référence dans le chapitre 2

Il existe d'autres propriétés sur cette algèbre, mais ce n'est pas l'objet de ce cours.

\Par

Les booléens sont très utiles en programmation; nous aurons l'occasion de nous en apercevoir ultérieurement dans ce livre.

\newpage

\subsection{Le début du XX\ieme{} siècle}

C'est en 1936 qu'apparaît le concept de machine universelle, capable d'exécuter tous les algorithmes, et que les notions de machine, algorithme, langage et information sont pensées comme un tout cohérent. Les premiers ordinateurs ont été construits en 1948 et leur puissance a ensuite évolué exponentiellement, c'est-à-dire avec une croissance très rapide.

\Par

Un ordinateur ne peut stocker que des nombres. Pour écrire du texte, on associe à chaque caractère un entier naturel et la correspondance entre le caractère et son code est appelé un \textit{charset}. La façon de transcrire un texte grâce aux codes des caractères qui le composent est appelé \textit{Encoding} (encodage).

\section{Les encodages}

\subsection{Le binaire}

\begin{defin}[bit]
Le \textit{bit} (contraction de \textit{Binary Digit}) est l'unité la plus simple en informatique. Il ne peut prendre que deux valeurs (désignées le plus souvent par 0 et 1).
\end{defin}

Un bit sert essentiellement à représenter un \og état \fg{} : vrai ou faux, oui ou non, le courant électrique passe ou ne passe pas, etc.

\begin{Remarque}
le mot \og bit \fg{}  est certes une contraction, mais il y a aussi un jeu de mot avec le mot anglais \og bit \fg{} qui signifie \og petit morceau \fg.

Le mot \og bit \fg{} a été popularisé par Claude Shannon, ingénieur en génie électrique et mathématicien américain du XX\ieme{} siècle, qui en attribue l'invention à John\linebreak Tukey, l'un des plus importants mathématiciens américains du XX\ieme{} siècle.
\end{Remarque}

\begin{defin}[système binaire]
Le \textit{système binaire} est le système de numération utilisant comme base le bit. 
\end{defin}

Le système binaire permet d'écrire ou d'encoder des nombres ou des caractères.

\subsection{L'ASCII}
\enlargethispage*{3em}

Les premiers textes étaient encodés à l'aide d'une sorte d'alphabet, un tableau contenant 128 caractères codés en binaire, c'est-à-dire $2^7$ caractères, afin que l'on puisse encoder les caractères avec seulement 7 bits. En effet, les ordinateurs utilisaient des cases mémoires d'un octet, mais ils réservaient toujours le 8\ieme{} bit pour le contrôle de parité (c'est une sécurité pour éviter les erreurs, qui étaient très fréquentes dans les premières mémoires électroniques).

\Par

Ce tableau contenait les caractères les plus utilisés dans la langue anglaise : les lettres de l'alphabet en majuscule (de A à Z) et en minuscule (de a à z), les dix chiffres arabes (de 0 à 9), des signes de ponctuation (point, virgule, point-virgule, deux points, points d'exclamation et d'interrogation, apostrophe ou quote,\linebreak guillemets ou double quote, parenthèses, crochets etc.), quelques symboles et certains caractères spéciaux invisibles (espace, retour-chariot, tabulation, retour-arrière, etc.).

ASCII est l'acronyme d'\textit{American Standard Code for Information Interchange}.

\begin{center}
\begin{tabular}{|Zc|Zc|}
\tabulartitle\hline
Code décimal & Caractère\\
\hline
0&[NUL]\\\hline
$\cdots$ & $\cdots$\\\hline
27 & [ESC]\\\hline
$\cdots$ & $\cdots$\\\hline
33	& !\\\hline
34	&	"	\\\hline
35	&	\#	\\\hline
$\cdots$ & $\cdots$\\\hline
48&	0\\\hline
49&	1\\\hline
$\cdots$ & $\cdots$\\\hline
57&	 9\\\hline
$\cdots$ & $\cdots$\\\hline
\end{tabular}
\qquad
\begin{tabular}{|Zc|Zc|}
\tabulartitle\hline
Code décimal & Caractère\\
\hline
65&		A	\\\hline
66&	B\\\hline
$\cdots$ & $\cdots$\\\hline
90&Z\\\hline
91 & 	[	\\\hline
$\cdots$ & $\cdots$\\\hline
97	&	a	\\\hline
98	&	b	\\\hline
$\cdots$ & $\cdots$\\\hline
122	&	z	\\\hline
123	&	\{	\\\hline
$\cdots$ & $\cdots$\\\hline
127	&	[DEL]\\\hline
\end{tabular}

\Par

\textit{Extrait de la table ASCII}
\end{center}
\label{table-ascii}

\begin{Exemple}
le caractère \og A \fg{} est codé en ASCII par le nombre 65 (dans le système décimal), qui correspond au nombre binaire 1000001, et au nombre hexadécimal 41.
\end{Exemple}

\begin{defin}[octet]
Un \textit{octet} est une suite de 8 bits (un \textit{octuplet}).
\end{defin}

\begin{Exemple}
\og 10000001 \fg{} est l'octet représentant le caractère \og A \fg.
\end{Exemple}

Ainsi, chaque caractère d'un texte est codé sur un octet.

Un texte de \numprint{10000} caractères est donc codé sur $10 \times \numprint{1000}$ octets, soit approximativement 10 kilo-octets (1 ko = $10^8$ octets = \numprint{1024} octets).

\Par


L'ASCII a tout de même un inconvénient majeur : celui de ne pouvoir coder les caractères accentués, qui apparaissent dans plusieurs langues, dont le français.

Il a donc fallu trouver un moyen d'étendre la table ASCII...

\subsection{La naissance de l'ISO}

La norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1 et qui\linebreak est souvent appelée Latin-1 ou Europe occidentale, fit son apparition dans le but de remédier à l'inconvénient de l'ASCII. Elle forme la première partie de la norme internationale ISO/CEI 8859, qui est une norme de l'\textit{Organisation internationale de normalisation} pour le codage des caractères en informatique.

En France, depuis l'apparition de l'euro, c'est le codage ISO-8859-15 (souvent appelé Latin-9) qui permet d'écrire tout ce que l'on veut dans notre langue. C'est une sorte de mise à jour de la norme ISO 8859-1.

\subsection{Au niveau mondial : l'Unicode}

Le problème de la norme ISO 8859-15 se trouve principalement dans les échanges de textes à l'échelle mondiale. 

Imaginez que vous codiez un programme en France et que vous souhaitiez collaborer avec un collègue américain. Ce dernier n'utilise pas nécessairement le même encodage que vous et va donc avoir quelques problèmes quand il lira vos propres codes. 

Il est donc primordial, dans ce cas de figure, d'utiliser un encodage qui puisse être utilisé dans tous les pays. C'est le but d'Unicode, dont la première publication remonte à octobre 1991.


\begin{defin}[point de code]
Un \textit{point de code} est la valeur numérique qui représente un caractère dans l'espace de codage des caractères.
\end{defin}


Unicode accepte plusieurs formes de transformations universelles pour représenter un point de code valide. Citons par exemple :
\begin{itemize}
\item UTF-8;
\item UTF-16;
\item UTF-32.
\end{itemize}
Le nombre après UTF représente le nombre minimal de bits des codets (c'est-à-dire des groupes de signes représentant une information) avec lesquels un point de code valide est représenté.


\Par

L'UTF-8 est par exemple le plus commun pour les applications comme Unix et\linebreak Internet. Son codage de taille variable lui permet d'être en moyenne moins\linebreak coûteux en occupation mémoire

\Par

L'UTF-16 est un bon compromis lorsque la place mémoire n'est pas trop\linebreak restreinte, car la grande majorité des caractères Unicode assignés pour les écritures des langues modernes (dont les caractères les plus fréquemment utilisés) le sont dans le plan multilingue de base et peuvent donc être représentés sur 16 bits.

\newpage

L'UTF-32 est utilisé lorsque la place mémoire n'est pas un problème et que l'on a besoin d'avoir accès à des caractères de manière directe et sans changement de taille (par exemple les hiéroglyphes égyptiens). L'avantage de cette transformation normalisée est que tous les codets ont la même taille. Il n'est donc pas nécessaire de lire des codets supplémentaires pour déterminer le début de la représentation d'un point de code. Toutefois, ce format est particulièrement peu économique (y compris en mémoire) puisqu'il « gaspille » inutilement au moins un octet (toujours nul) par caractère.

\subsection{Les logiciels}

Selon le système d'exploitation que l'on utilise, il existe quelques éditeurs de textes qui permettent de choisir l'encodage des caractères.

Par exemple,

\begin{itemize}
\item sous Windows, \textit{Notepad++};
\item sous OSX, \textit{TextEdit};
\item sous Unix (Linux par exemple), \textit{Kwrite} ou \textit{Geany}.
\end{itemize}

\section{Les bases}

\begin{defin}[intervalle d'entiers]
Soient $m$ et $n$ deux nombres entiers.

On note $\llbracket m~;n\rrbracket$ l'ensemble de tous les entiers compris entre $m$ (inclus) et $n$ (inclus).
\end{defin}

\subsection{Principe général}

Soit $N$ un entier naturel. Si : 
\[
N=a_n\times b^n + a_{n-1}\times b^{n-1}+\cdots+a_1 \times b^1 + a_0\times b^0 \quad,\quad a_k\in\llbracket 0~;~b-1\rrbracket,
\]
alors on dira que l'écriture de $n$ en base $b$ est :
\[
N=\overline{a_na_{n-1}a_{n-2}\cdots a_2a_1a_0}^{\;b}.
\]

\begin{Remarque}
afin de savoir en quelle base on écrit un nombre, on l'écrit en le surmontant d'une barre suivie de la base.
\end{Remarque}

\begin{Exemple}
soit $N$ tel que :
\[
N = 3\times5^4 + 4\times5^3 + 1\times5^1 + 2\times5^0.
\]
Alors, 
\[
N=\base{34012}{5}.
\]
\end{Exemple}

\subsection{En base 2}

La base 2 est le système binaire. Elle est donc très importante en informatique. La base est constituée uniquement de deux chiffres: 0 et 1. Ainsi, tout nombre écrit en base 2 ne comportera que des 0 et des 1.

Pour convertir un nombre décimal en base 2, il faut effectuer des divisions euclidiennes successives par 2 et écrire les restes obtenus en \og remontant \fg.

\begin{Exemple}
on souhaite convertir $\base{25}{10}$  en base 2.	

\[
\opidiv{25}{2} \quad \rightarrow \quad  
\opidiv{12}{2} \quad \rightarrow \quad  
\opidiv{6}{2} \quad \rightarrow \quad 
\opidiv{3}{2} \quad \rightarrow \quad 
\opidiv{1}{2}
\]
On en déduit que :
\[
25 = 1 \times 2^0 + 0\times2^1 + 0\times2^2 + 1\times2^3+1\times2^4
\]
soit :
\[
25 = \boxed{1}\times2^4 + \boxed{1}\times2^3 + \boxed{0}\times2^2 + \boxed{0}\times2^1 + \boxed{1} \times 2^0.
\]
Ainsi,
\[
\base{25}{10}=\base{11001}{2}.
\]
\end{Exemple}

\begin{methode}
Après avoir posé toutes les divisions, on écrit tous les restes en partant du dernier obtenu jusqu'au premier.
\end{methode}

\subsection{La base hexadécimale}
\enlargethispage*{2em}

Elle est constituée de 16 caractères :
\[
\rm 0;1;2;3;4;5;6;7;8;9;A;B;C;D;E;F.
\]

\subsubsection{Du décimal à l'hexadécimal}

Pour convertir un nombre décimal en hexadécimal, on effectue des divisions\linebreak euclidiennes par 16, sur le même principe que l'écriture en base 2.

\begin{Exemple}
on souhaite convertir le nombre décimal \numprint{1234}  en hexadécimal.
\[
\begin{array}{ccccc}
\opidiv{1234}{16} & \quad \rightarrow \quad   &
\opidiv{77}{16} &\quad \rightarrow \quad  &
\opidiv{4}{16}\\
\downarrow & & \downarrow &  & \downarrow \\
2 &  & 13\rightarrow D &  & 4
\end{array}
\]
Ainsi,
\[
\base{1234}{10}=\base{4D2}{16}.
\]
\end{Exemple}

\newpage

\subsubsection{Du binaire à l'hexadécimal}

Pour convertir du binaire à l'hexadécimal, il suffit de regrouper les bits par groupe de 4 en allant de la droite à la gauche.

\begin{Exemple}
on souhaite convertir $\base{01001101}{2}$ en hexadécimal.
\[
\begin{array}{|L|c|c|}
\hline
\text{Binaire} & 0100 & 1101\\\hline
\text{Pseudo-décimal} & 4 & 13\\\hline
\text{Hexadécimal} & 4 & \text{D}\\\hline
\end{array}
\]
Ainsi,
\[
\base{01001101}{2}=\base{4D}{16}.
\]
\end{Exemple}

\subsubsection{De l'hexadécimal au décimal}

Le principe est le même que pour passer du binaire au décimal, si ce n'est que l'on va remplacer les lettres par les nombres correspondants (on remplace A par 10, B par 11...).

\begin{Exemple}
on souhaite convertir $\base{7EF}{16}$ en décimal.
\begin{itemize}
\item F, correspondant au nombre 15, est au rang 0;
\item E, correspondant au nombre 14, est au rang 1;
\item 7 est au rang 2.
\end{itemize}
On doit donc calculer :
\[
7 \times 16^2 + 14\times16^1 + 15\times16^0 = \numprint{2031}.
\]
Ainsi, $\base{7EF}{16}=\base{\numprint{2031}}{10}$.
\end{Exemple}

\begin{solintro}
\begin{questions}
\item $\base{1000001}{2}$ correspond à la lettre \og A \fg. Pour obtenir le binaire correspondant à la lettre \og B \fg, il faut lui ajouter 1.

Il y a deux façons de faire : soit on convertit 66 en binaire (car 65 est le code ASCII de \og A \fg, donc 66 est celui de \og B \fg), soit on prend le suivant de $\base{1000001}{2}$. Ce binaire se terminant par 1, son suivant se termine par 0, et il faut ajouter 1 au bit précédent.

On trouve alors que $\base{1000010}{2}$ est le binaire correspondant à \og B \fg.

\Break

\item Pour convertir $\base{75}{10}$ en binaire, il faut regarder les divisions euclidiennes par 2 :
\begin{center}
\begin{minipage}{17mm}
\opidiv{75}{2}
\end{minipage}
 $\rightarrow$
\begin{minipage}{17mm}
\opidiv{37}{2}
\end{minipage} 
$\rightarrow$ 
\begin{minipage}{17mm}
\opidiv{18}{2}
\end{minipage}
$\rightarrow$
\\[12pt]
\begin{minipage}{10mm}
\opidiv{9}{2}
\end{minipage}
$\rightarrow$
\begin{minipage}{10mm}
\opidiv{4}{2}
\end{minipage}
$\rightarrow$
\begin{minipage}{10mm}
\opidiv{2}{2}
\end{minipage}  
$\rightarrow$
\begin{minipage}{10mm}
\opidiv{1}{2}
\end{minipage}
\end{center}
On prend ensuite les restes dans l'ordre inverse dans lequel nous les avons trouvés.

On obtient alors que $\base{75}{10}=\base{1001011}{2}$.

\item Pour convertir $\base{2001}{10}$ en hexadécimal, il faut diviser par 16.
\begin{center}
\begin{minipage}{25mm}
\opidiv{2001}{16}
\end{minipage}
$\rightarrow$
\begin{minipage}{20mm}
\opidiv{125}{16}
\end{minipage}
$\rightarrow$
\begin{minipage}{17mm}
\opidiv{7}{16}
\end{minipage}
\end{center}
On prend alors les restes dans l'ordre inverse dans lequel nous les avons trouvés : il y en a un qui dépasse 9. Comme 10 correspond à A, 11 correspond à B, 12 correspond à C et donc 13 correspond à D.

On obtient alors $\base{2001}{10}=\base{7D1}{16}$.

\begin{Remarque}
le film de Stanley Kubrick \textit{2001, l'Odyssée de l'espace} se serait ainsi appelé en hexadécimal \textit{7D1, l'Odyssée de l'espace}.
\end{Remarque}


\item Pour convertir $\base{ABC}{16}$ en binaire, on peut commencer par le convertir en décimal.
\begin{itemize}
\item C, correspondant au nombre 12, occupe le rang 0;
\item B, correspondant au nombre 11, occupe le rang 1;
\item A, correspondant au nombre 10, occupe le rang 2.
\end{itemize}
On doit donc calculer :
\[
10 \times 16^2 + 11 \times16^1 + 12 \times 16^0 = \numprint{2748}.
\]
Ainsi, $\base{ABC}{16}=\base{\numprint{2748}}{10}$.

\BreakWithoutItem

Pour convertir $\base{\numprint{2748}}{10}$ en binaire, afin d'éviter les divisions euclidiennes successives (ce qui peut paraître long), on peut se baser sur les puissances successives de 2 :

\begin{aretenir}
\begin{multicols}{2}
\begin{center}
\begin{tabular}{|Zc|Zc|}
\tabulartitle\hline
$n$ & $2^n$\\
\hline
0 & 1\\\hline
1 & 2\\\hline
2 & 4\\\hline
3 & 8\\\hline
4 & 16\\\hline
5 & 32\\\hline
\end{tabular}
\end{center}

\begin{center}
\begin{tabular}{|Zc|Zc|}
\tabulartitle\hline
$n$ & $2^n$\\
\hline
6 & 64\\\hline
7 & 128\\\hline
8 & 256\\\hline
9 & 512\\\hline
10 & \numprint{1024}\\\hline
11 & \numprint{2048}\\\hline
\end{tabular}
\end{center}
\end{multicols}
\end{aretenir}

Les coefficients des puissances de 2 sont donc répartis ainsi :
\begin{align*}
\numprint{2748}&=\numprint{2048}+512+128+32+16+8+4\\
&=2^{11}+2^9+2^7+2^5+2^4+2^3+2^2.
\end{align*}
On a donc :

\Par

\begin{center}
\begin{tabular}{|*{12}{Zc|}}
\hline
$2^{11}$ & $2^{10}$ & $2^9$ & $2^8$ & $2^7$ & $2^6$ & $2^5$ & $2^4$ & $2^3$ & $2^2$ & $2^1$ & $2^0$\\
\hline
1 & 0&1&0&1&0&1&1&1&1&0&0\\
\hline
\end{tabular}
\end{center}

\Par

Ainsi, $\base{ABC}{16}=\base{\numprint{2748}}{10}=\base{101010111100}{2}$.
\end{questions}

\begin{aretenir}
\qrset{height=1.1cm,version=5}\rput(-1.4,-1.5){
\psframebox{\qrcode{http://sebastienguillon.com/test/javascript/convertisseur.html}}}
%\vspace*{-10pt}

À l'avenir, pour aller plus vite dans les conversions, vous pourrez utiliser le convertisseur accessible à la page :\hfill

\begin{center}\ttfamily\small
http://sebastienguillon.com/test/javascript/convertisseur.html
\end{center}

\Par

C'est un convertisseur binaire $\leftrightarrow$ hexadécimal $\leftrightarrow$ décimal.
\end{aretenir}
\end{solintro}