# ISN Représentation binaire
## La représention binaire

| Savoirs : | Un ordinateur est une machine qui manipule des valeurs numériques représentées sous forme binaire. |
| Capacités : | Manipuler à l'aide d'opérations élémentaires les trois unités de base : bit, octet, mot. |
| Observation : | On met en évidence, sous forme de questionnement, la présence du numérique dans la vie personnelle et professionnelle, au travers d'exemples. |

### Systèmes de numération

Quand des sociétés humaines ont commencé à compter, des systèmes de numération ont été mis au point, pour permettre de communiquer des nombres avec moins de mots.
La numération la plus évidente à inventer consiste à montrer des collections de symboles. Des comptables de Mésopotamie ont utilisé des cylindres pour imprimer sur de l'argile des données commerciales. Les « imprimés » étaient complétés par des marques faites à l'aide d'un stylo en roseau, le calame.
Exercice
* Pourquoi cette méthode a-t-elle été remplacée par d'autres plus tard ?
* Retrouvez l'origine du mot calcul en Mésopotamie : qu'appelait-on les calculi ?
Les comptages simples, tels que des encoches sur un morceau de bois ou d'os, les collections de calculi dans une bourse en terre, deviennent plus pratiques quand on regroupe les unités par paquets. En Mésopotamie, la méthode utilisée consistait à faire des paquets de 60 : ça a mené à l'invention d'un système numérique à base 60.
Autres civilisations, autre mœurs, autres bases de numération, voici quelques exemples :
| Époque | Civilisation | base de numération |
| Depuis -3000 | Civilisation Sumérienne, puis Mésopotamienne, Chine, Inde | Base sexagésimale (60) : on peut utiliser les pouces et les phalanges pour compter jusqu'à 60 avec les mains |
| Encore valide en 2013 | Tous pays | Base sexagésimale (60) : une heure compte 60 minutes, elles-même subdivisées en 60 secondes. |
| Jusqu'au XVIème siècle | Civilisations aztèque, civilisation Maya | Base vicésimale (20) : les calculs étaient faits dans cette base jusqu'à l'invasion espagnole |
| Moyen-Âge | Pays européens | Base vicésimale (20) : cette base était souvent utilisée en concurrence avec la base décimale. Il en reste de nombreux vestiges : le nombre « quatre vingt » toujours utilisé, le sou, égal à un vingtième de franc. |
| -200 | Empire romain | Base duodécimale (12). Le comptage par douze est souvent utilisé, et a laissé de nombreuses traces dans notre vocabulaire. Quelles sont les traces que vous connaissez ? Cherchez les sens du mot « grosse ». |
| Jusqu'à 1971 | Empire brittanique | Base duodécimale (12). La pièce de 1 shilling valait 12 pence (pluriel de penny) |
| Encore valide en 2013 | États-Unis | Base duodécimale (12). Un pied (mesure de longueur) se divise en 12 pouces |

#### Questions sur les bases de numération

La base décimale que nous utilisons aujourd'hui vient de nos chiffres « arabes », qui ont été inventés en Inde.
* Pourquoi la base 10 est-elle utilisée très largement partout ?
* Est-ce la base la mieux appropriée dans tous les cas ?
* Est-il facile de construire une machine à calculer qui fonctionne avec la base 10 ?

### Exemple en base 5

Comme la majorité d'entre nous a cinq doigts aux membres, l'utilisation d'une base 5 paraît judicieuse.
Cette base est souvent utilisée, par exemple pour compter des points dans une rencontre sportive, ou pour compter des voix dans un bureau de vote.

#### Exercice résolu

Comment pourrions-nous noter le nombre de jours d'une année non bissextile, en base 5 ? Les symboles utilisés pour les chiffres seront 0, 1, 2, 3 et 4.
Solution Les calculs seront menés en base 10, qui nous est plus familière.
On divise 365 par 5 : $365\div 5=73$, reste $0$.
On divise 73 par 5 : $73\div 5=14$, reste $3$.
On divise 14 par 5 : $14\div 5=2$, reste $4$.
On divise 2 par 5 : $2\div 5=0$, reste $2$.
On s'arrête là, et on écrit la suite des restes à l'envers : $2430$. C'est la représentation en base 5 du nombre de jours d'une année non bissextile.
On peut vérifier que : ${\begin{array}{rcl}2\times 5^{3}+4\times 5^{2}+3\times 5^{1}+0\times 5^{0}&=&\\2\times 125+4\times 25+3\times 5+0\times 1&=&\\250+100+15&=&365\end{array}}$

#### Convention de notation

On utilise souvent les premiers symboles de la suite 0123456789ABCDEF... (autant qu'il en faut, pas plus); comme symboles numériques pour une base donnée. Par exemple, pour la base 12, les symboles sont 0123456789AB.
Chaque fois qu'une ambiguïté est possible, on place un symbole de la base en indice du nombre écrit. Par exemple, le résultat de l'exercice résolu peut s'écrire $365_{10}=2430_{5}$, ou encore $365_{dec}=2430_{quin}$, ce qui signifie que 365 en base 10 (décimale) vaut 2430 en base 5 (quinaire).

### La base 2 pour les ordinateurs

La base 5, ou base quinaire, semble adaptée pour les humains, à cause de leurs cinq doigts. Il existe des méthode de comptage avec les mains pour les bases 10, 12, 20 et 60.
Cependant les ordinateurs sont faits d'automatismes électroniques, où il est plus facile de distinguer deux états seulement : arrêt/marche, ou éteint/allumé, qu'on représente aussi souvent comme faux/vrai, ou 0/1.
Exemple : les composants électroniques de la famille TTL (transistor-transistor logic) obéissent à la norme suivante :
* les tensions utilisées sont toujours entre 0 et 5 V ;
* les tensions entre 0 et 2 V correspondent à la valeur binaire $0_{bin}$ ;
* les tensions entre 3 et 5 V correspondent à la valeur binaire $1_{bin}$ ;
* les tensions ne restent presque jamais entre 2 et 3 V, et on s'arrange pour ne faire des calculs qu'en dehors des moments où existent des risques (aléas) d'avoir des tensions entre 2 et 3 volt.

#### Exercice résolu

Trouver la représentation en binaire de 365 en décimal.
Solution
On effectue la suite d'opérations suivantes :
${\begin{array}{rcl}365\div 2=184&{reste}&1\\184\div 2=92&{reste}&0\\92\div 2=46&{reste}&0\\46\div 2=23&{reste}&0\\23\div 2=11&{reste}&1\\11\div 2=5&{reste}&1\\5\div 2=2&{reste}&1\\2\div 2=1&{reste}&0\\1\div 2=0&{reste}&1\\\end{array}}$
Donc la solution est : $365_{dec}=101110001_{bin}$
Vérifiez que... ${\begin{array}{lcl}1\times 2^{8}+&&\\0\times 2^{7}+&&\\1\times 2^{6}+&&\\1\times 2^{5}+&&\\1\times 2^{4}+&&\\0\times 2^{3}+&&\\0\times 2^{2}+&&\\0\times 2^{1}+&&\\1\times 2^{0}&=&365\end{array}}$
Dans l'exemple précédent, on voit que pour représenter $365_{dec}$ en binaire, 9 chiffres sont nécessaires. On peut retenir que pour un même nombre, l'écriture binaire est toujours environ trois fois plus longue que l'écriture décimale. Ce désavantage, pour les ordinateurs, est largement compensé par la grande simplicité des opérations que permet le système binaire.

#### La simplicité des opérations en binaire

Comparez les tables de multiplications en systèmes décimal et binaire !
Combien vous a-t-il fallu de temps pour mémoriser les tables de multiplication au cours de votre scolarité ? Les connaissez-vous bien ?
La table de multiplication en binaire est beaucoup plus simple ! (On a retiré la multiplication par zéro des tables de l'illustration, et on a un peu triché en supprimant les lignes et colonnes de 10 dans le cas de la table en base deux).
Exercices
* Retrouvez les tables de multiplication complètes en système binaire. On doit tenir compte du chiffre zéro. Il faut la table de multiplication et la table d'addition. Ne pas oublier de signaler quand il y a une retenue.
* Multipliez $101110001_{bin}$ par $11_{bin}$, vérifiez que le résultat est le même que pour la multiplication de 365 par 3.

### Conversions d'un nombre d'une base à l'autre

En vous inspirant des exercices ci-dessus, on peut décrire en toute généralité l'algorithme qui permet de convertir un nombre écrit en base X vers sa représentation en base Y. Il faut pour cela :
* passer de la suite des symboles représentant le nombre en base X au nombre entier représenté,
* puis de ce nombre vers la suite de symboles le représentant en base Y.

#### Algorithme pour passer de la représentation d'un nombre en base X à sa valeur

Exemple de fonctionnement
On lance le programme, et on répond "101" puis "2".
À ce stade, (ligne 10)
* symboles vaut "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
* val vaut 0,
* nombreEnBaseX vaut "101",
* X vaut 2.
* Les valeurs de c et i sont indéterminées.
Au premier passage dans la boucle tantQue,
* la longueur de nombreEnBaseX vaut 3, dont on entre dans la boucle.
* val prend la valeur 2 * 0, il reste nul.
* puis c prend la valeur "1" et
* nombreEnBaseX est raccourci à gauche pour devenir "01".
* i prend la valeur 1 (position de "1" dans la chaîne "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
* puis val prend la valeur 0+1 = 1.
Au deuxième passage dans la boucle tantQue,
* la longueur de nombreEnBaseX vaut 2, dont on entre dans la boucle.
* val prend la valeur 2 * 1 = 2.
* puis c prend la valeur "0" et
* nombreEnBaseX est raccourci à gauche pour devenir "1".
* i prend la valeur 0 (position de "0" dans la chaîne "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
* puis val prend la valeur 2+0 = 2.
Au troisième passage dans la boucle tantQue,
* la longueur de nombreEnBaseX vaut 1, dont on entre dans la boucle.
* val prend la valeur 2 * 2 = 4.
* puis c prend la valeur "1" et
* nombreEnBaseX est raccourci à gauche pour devenir "".
* i prend la valeur 1 (position de "1" dans la chaîne "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
* puis val prend la valeur 4+1 = 5.
Il n'y a pas de quatrième passage dans la boucle tantQue, puisque la longueur de nombreEnBaseX vaut 0. On passe donc à la suite, ce qui établit le résultat à 5.
Exercice
* Vérifiez que si on lance l'algorithme et qu'on répond "75" puis "8", le résultat vaut 61 (en base décimale).
* Vérifiez que si on lance l'algorithme et qu'on répond "AA" puis "16", le résultat vaut 176 (en base décimale).

#### Algorithme pour passer d'une valeur entière à sa représentation base Y

Exemple de fonctionnement
On lance l'algorithme et on répond "5" et "2". À ce moment-là (à la ligne 11),
* symboles vaut "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
* val vaut 5, Y vaut 2 et
* repr vaut "" (chaîne vide).
* Les valeurs de c, quotient, reste sont indéterminées.
Au premier passage dans la boucle,
* val vaut 5, donc on y entre.
* quotient prend la valeur 2 et
* reste prend la valeur 1 ;
* val prend la valeur 2 ;
* c devient "1" puisque c'est le caractère numéro 1 de "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
* repr devient "1" attaché à "", donc "1".
Au deuxième passage dans la boucle,
* val vaut 2, donc on y entre.
* quotient prend la valeur 1 et
* reste prend la valeur 0 ;
* val prend la valeur 1 ;
* c devient "0" puisque c'est le caractère numéro 0 de "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
* repr devient "0" attaché à "1", donc "01".
Au troisième passage dans la boucle,
* val vaut 1, donc on y entre.
* quotient prend la valeur 0 et
* reste prend la valeur 1 ;
* val prend la valeur 0 ;
* c devient "1" puisque c'est le caractère numéro 1 de "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
* repr devient "1" attaché à "01", donc "101".
Il n'y a pas de quatrième passage dansla boucle, puisque val vaut 0. On passe donc à la suite et le résultat vaut "101".
Exercice
* Vérifiez que si on lance l'algorithme et qu'on répond "61" puis "8", le résultat vaut 75 (en base octale).
* Vérifiez que si on lance l'algorithme et qu'on répond "176" puis "16", le résultat vaut AA (en base hexadécimale).

### D'autres bases pour les octets

La valeur $176_{dec}$ est égale à $10101010_{bin}$.
Il est assez facile de repérer une faute de frappe quand on écrit 176, quand on se relit. Cependant, une faut de frappe telle que 10101110 au lieu de 10101010 peut passer plus facilement inaperçue. Et le risque augmente avec la longueur des nombres.
Remarquons que $10101010_{bin}=176_{dec}$, cependant que $10101110_{bin}=180_{dec}$. L'erreur est plus évidente à repérer en codage décimal.

#### Base hexadécimale (16)

On utilise très souvent la base hexadécimale pour représenter les octets, c'est à dire les nombres binaires à 8 chiffres, de 00000000 à 11111111. En effet, seize est égal à deux puissance quatre : autrement dit, chaque chiffre hexadécimal correspond directement à quatre chiffre binaires, sans erreur possible.
$10101010_{bin}=AA_{hex}$, cependant que $10101110_{bin}=AE_{hex}$. L'erreur est plus évidente à repérer en codage hexadécimal, et en plus, elle montre tout de suite que l'erreur se situe dans les quatre chiffre binaires de poids faible (à droite du nombre).
N.B. : en base hexadécimale, les chiffres sont 0123456789ABCDEF.

#### base octale (8)

De même que la base hexadécimale est très pratique pour exprimer des nombres binaires de quatre ou huit chiffres, la base octale va bien pour exprimer des nombres binaires de 3, 6, 9 ou 12 chiffres : en effet, huit est égal à deux à la puissance 3.
N.B. : en base octale, les chiffres sont 01234567.