Vous tapez le nombre 42 sur un clavier, mais à l'intérieur de la machine, il n'existe ni chiffre « 4 » ni chiffre « 2 » : seulement des interrupteurs ouverts ou fermés, du courant qui passe ou ne passe pas.
Comment, avec deux états seulement — 0 et 1 —, représenter n'importe quel nombre ? Et pourquoi nos ordinateurs ont-ils choisi de tout coder ainsi, plutôt qu'avec nos dix chiffres habituels ?
Actuellement, nos appareils numériques ne savent manipuler que des bits : une succession de 0 et de 1. Cela vient de la conception même de l'électronique actuelle.
On peut alors se poser la question sur la façon dont un appareil numérique manipule d'autres nombres que 0 et 1.
En mathématiques, il n'est pas obligatoire d'écrire un nombre en base 10.
Un nombre écrit sous la forme \(a_n a_{n-1} a_ {n-2} ... a_2 a_1 a_0\) en base \(b\) signifie qu'il est égal à :
$$ a_n \times b^n + a_{n-1} \times b^{n-1}+ a_ {n-2} \times b^{n-2} + ... +a_2 \times b^2 + a_1 \times b^1 + a_0 $$
Sans mention particulière, si un nombre tel que 314 est écrit, cela sous-entend qu'il est écrit en base 10.
La notation \( {a_n a_{n-1} a_ {n-2} ... a_2 a_1 a_0}_b\) sous-entend que ce nombre est écrit en base \(b\).
Par exemple, \(1234_6\) sous-entend que ce nombre est écrit en base 6.
Pour convertir un nombre écrit en base 2 vers la base 10, on utilise directement la définition d'une écriture en base : chaque bit possède un poids qui est une puissance de 2. Le bit le plus à droite a pour poids \(2^0 = 1\), le suivant \(2^1 = 2\), puis \(2^2 = 4\), etc.
Il suffit alors de multiplier chaque bit par son poids, puis d'additionner le tout. Les bits égaux à 0 n'apportent rien : seuls les bits égaux à 1 comptent.
Par exemple :
$$1011_2 = 1{\times}2^3 + 0{\times}2^2 + 1{\times}2^1 + 1{\times}2^0 = 8 + 0 + 2 + 1 = 11$$
À faire dans le cahier.
Convertir :
À faire dans le cahier.
Quel est le but du code suivant ?
Est programmé ci-dessous une deuxième fonction permettant de transformer un string qui représente un nombre écrit en binaire à deux chiffres et permettant de donner son écriture en base 10.
En suivant cet exemple :
trois_bits_vers_base_10 et qui prend comme paramètre un string de trois caractères et qui renvoie sa conversion en base 10 sous forme d'un integer.quatre_bits_vers_base_10 et qui prend comme paramètre un string de quatre caractères et qui renvoie sa conversion en base 10 sous forme d'un integer.
L'exercice précédent est répétitif et l'on sent que l'on peut faire mieux car nous traitons des cas ressemblant à ceux déjà faits. Par exemple la conversion de '0000' et de '00000' sont similaires.
Si texte est un string, texte[0] désigne le premier caractère et texte[1:] représente tout le string en
omettant le premier caractère.
Compléter la fonction ci-dessous qui utilisera quatre_bits_vers_base_10 :
Les exercices précédents pourraient durer indéfiniment.
Le but est maintenant de compléter la fonction binaire_vers_base_10 qui prend en paramètre un string composé de 0 et de 1
de n'importe quelle taille et qui retourne l'entier converti en base 10.
Compléter la fonction base_10_vers_binaire_basique qui prend en paramètre un integer x compris entre 0 et 15 et qui renvoie un string correspondant à son écriture en base 2.
Pour passer d'un nombre écrit en base 10 à son écriture en base deux, on peut utiliser l'algorithme suivant.
Il suffit de faire des divisions par deux successives et de regarder les restes. On divise le nombre par 2, puis on divise le quotient obtenu par 2, et ainsi de suite : l'algorithme s'arrête dès que le quotient devient égal à 0. Il ne reste plus qu'à lire les restes de bas en haut.
À faire dans le cahier.
À l'aide de la méthode précédente :
À faire dans le cahier.
Une adresse IPv4 est constituée de 4 octets, séparés par des points.
Donner l'écriture en binaire de l'adresse IP suivante : 192.168.7.1. On fera attention à bien écrire chaque octet avec 8 bits.
On considère la fonction binaire à la page suivante. Cette fonction prend en paramètre
un entier positif a en écriture décimale et renvoie son écriture binaire sous la forme d’une
chaine de caractères.
Exemples :
>>> binaire(0)
'0'
>>> binaire(77)
'1001101'
En plus de la base de 2, il est indispensable de connaitre pour quelqu'un travaillant dans l'informatique la base 16 (hexadécimal).
Par convention le nombre \(10\) est associé à \(A_{16}\), \(11\) à \(B_{16}\) et ainsi de suite jusqu'à \(15\) qui est associé à \(F_{16}\).
À faire dans le cahier.
Convertir :
Créer une fonction caractere_hexa_vers_base_10 qui prend en paramètre un string d'un seul caractère et qui retourne
sa valeur en base 10.
Exemples :
>>> caractere_hexa_vers_base_10('0')
0
>>> caractere_hexa_vers_base_10('9')
9
>>> caractere_hexa_vers_base_10('B')
11
Compléter la fonction ci-dessous. Celle-ci utilisera la fonction caractere_hexa_vers_base_10 de l'exercice précédent.
Un octet (Byte en anglais) est une succession de 8 bits.
À faire dans le cahier.
Lorsqu'un nombre est écrit en base 16, on parle d'écriture en hexadécimal.
On peut facilement passer d'une écriture en base 2 en base 16 et réciproquement.
Il suffit de remarquer qu'un nombre écrit en base 2 avec 4 caractères se convertit directement en base 16.
Donc :
À faire dans le cahier.
Convertir :
À faire dans le cahier.
Poser et effectuer les opérations suivantes :
Limitons-nous aux entiers écrits sur un octet :
Sur un octet, nous pouvons prendre le choix d'encoder soit un entier strictement positif soit un entier relatif c'est-à-dire pouvant être négatif
Pour cela, nous avons deux possibilités
Dans le cas d'un binaire non signé, l'écriture en base 2 d'un nombre et son écriture en binaire correspondent.
Par exemple, le nombre 16 peut être encodé sur un octet : 0001 0000
Dans le cas d'un binaire signé, on utilise la méthode suivante :
Si c'est un entier positif, on utilise son écriture en base 2
Si c'est un entier négatif, on prend l'écriture de son opposé en base 2, puis son complément à 2 (on inverse les 0 et les 1) puis on ajoute 1
Essayons de trouver l'écriture du nombre -20 sur un octet.
L'écriture de -20 en binaire signé est 1110 1100 sur un octet.
Vérification :
$$ \begin{equation} \begin{aligned} &00010100_2 \\ + &11101100_2 \\ = \color{red}1&\color{green}00000000_2 \end{aligned} \end{equation} $$À faire dans le cahier.
Donner la représentation sur un octet des nombres suivants :
Puis :
1100 0001 en binaire non signé ?1100 0001 en binaire signé ?Un nombre écrit sous la forme \(a_n a_{n-1} ... a_ {1} a_ {0},a_ {-1} ... a_{-m}\) en base \(2\) signifie qu'il est égal à :
$$ a_n \times 2^{n} + a_{n-1} \times 2^{n-1}+...+ a_ 1 \times 2^1 +a_ 0 \times 2^0 + a_ {-1} \times 2^{-1} +... +a_{-m} \times 2^{-m}$$
Essayons de trouver l'écriture en base 10 du nombre \(101,011_2\).
$$ \begin{equation} \begin{aligned} \color{red}{101,011_2} &= \color{red}{1} \color{green}{ \times 2^2 +}\color{red}{0} \color{green}{\times 2^1 + }\color{red}{1} \color{green}{\times 2^0 + }\color{red}{0} \color{green}{\times 2^{-1} + }\color{red}{1} \color{green}{\times 2^{-2} + }\color{red}{1} \color{green}{\times 2^{-3}}\\ &= 4+1+\frac{1}{4} + \frac{1}{8} \\ &=4+1+0,25+0,125\\ &= 5,375 \end{aligned} \end{equation} $$Pour passer de la base 10 à la base 2, nous pouvons utiliser les algorithmes utilisés pour les nombres entiers. Mais parfois les écritures en base 2 comportent une infinité de chiffres après la virgule.
Essayons de trouver l'écriture en base 2 du nombre 5,25 :
La plus grande puissance de 2 intervenant est \(2^2\).
$$ \begin{equation} \begin{aligned} 5,25 &= 2^2+1,25\\ &= 2^2+2^0 + 0,25\\ &= 2^2+2^0+2^{-2}\\ &= 101,01_2 \end{aligned} \end{equation} $$Essayons de trouver l'écriture en base 2 du nombre 5,2 :
La plus grande puissance de 2 intervenant est \(2^2\).
$$ \begin{equation} \begin{aligned} 5,2 &= 2^2+1,2\\ &= 2^2+2^0 + 0,2\\ &= 2^2+2^0 + 0,125+0,075\\ &= 2^2+2^0+2^{-3}+0,075\\ &= 2^2+2^0+2^{-3}+0,0625+0,0125\\ &= 2^2+2^0+2^{-3}+2^{-4}+0,0125\\ &= 2^2+2^0+2^{-3}+2^{-4}+0.0078125 + 0,0046875\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} +0,0046875\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 0.00390625 +0.00078125\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } +0.00078125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 0.00048828125 + 0.00029296875 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 0.00029296875 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 0.000244140625 + 0.000048828125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 2^{-12} + 0.000048828125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 2^{-12} + 2^{-15}+.............. \\ &=101,0011001100110011001100110011001100110011001100110011........_2 \end{aligned} \end{equation} $$Pour se persuader du nombre de chiffres après la virgule, on peut s'aider des égalités suivantes :
$$ \begin{equation} \begin{aligned} 0,2&=\frac{2}{10} \\ &=\frac{1}{5} \\ &=\frac{1}{8} + \frac{1}{16} + \frac{1}{80}\\ &= \frac{1}{8} + \frac{1}{16} + \frac{1}{16} \times \frac{1}{5} \\ &= 2^{-3} + 2^{-4} + 2^{-4} \times \color{red}(\frac{1}{5} ) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-4} \times \color{red}(2^{-3} + 2^{-4} + 2^{-4} \times \color{green}(\frac{1}{5} ) \color{red}) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-8} \times \color{green}(\frac{1}{5} ) \color{black} \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-8} \times \color{green}(2^{-3} + 2^{-4} + 2^{-4} \times \color{blue}(\frac{1}{5} ) \color{black}) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-11} + 2^{-12} + 2^{-12} \times \color{blue}(\frac{1}{5} ) \\ &=... \end{aligned} \end{equation} $$ À chaque étape, il restera toujours la fraction \(\frac{1}{5}\)En ce qui concerne les nombres décimaux, en informatique nous pouvons avoir deux approches :