Il y a 10 sortes de gens, celles qui comprennent le binaire et les autres.
Fiche de cours à imprimer – Fiche d'exercices à imprimer – Diaporama
Du point de vue des mathématiques, les nombres $14$, $\frac{28}{2}$, $\sqrt{196}$, $1110_b$ sont tous identiques et on pourra raisonner indépendamment de la façon dont on choisit de les écrire. Toutefois, l'écriture choisie a son importance car certaines écritures sont plus commodes que d'autres.
L'informaticien a le même genre de problème : Il doit décider comment il écrira les nombres dans la machine et les choix qu'il fera auront une importance sur les calculs qu'il pourra faire.
La technologie d'aujourd'hui repose sur des quantités tout ou rien, ce que l'on traduire par 1 ou 0. Il est alors naturel que les nombres utilisent l'écriture binaire qui n'a besoin que des symboles 1 et 0.
Les seules bases importantes pour nous seront
On connaît les 10 symboles 0, … 9 de la base 10. Quand on utilise une base plus petite, on a intérêt à utiliser les mêmes symboles. Par exemple, en binaire, on utilise 0 et 1.
Mais quand la base est plus grande, que faire ? En base 16, il nous faut 16 symboles.
On choisit de compléter par les lettres A, B, C, D, E, F.
On a donc la correspondance A = 10, B = 11, C = 12, D = 13, E = 14 et F = 15
Exercices 1 et 1 bis de la fiche d'exercices.
Le principe de notre notation des nombres repose sur :
Par exemple, en décimal on utilise 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 et les paquets sont des paquets de 10.
Sur la figure ci-dessous, vous voyez à gauche les paquets possibles : une unité seule, un paquet de 10 (entouré en noir) et un paquet de 10 paquets de 10, c'est à dire un paquet de 100 (entouré en bleu).
Sur la droite, une quantité indéterminée d'items a été triée en paquets.
On constate que l'on a 2 paquets bleus, 1 noir et 3 unités. Dans ce cas on fait intuitivement le calcul et on déduit qu'il y a en tout 213 unités.
On reproduit l'expérience mais en envisageant maintenant des paquets de 4 : les paquets noirs contiennent 4 unités, les paquets bleus contiennent 4 paquets noirs et les paquets rouges contiennent 4 paquets bleus, comme on le voit sur la gauche.
Sur la droite le nouveau découpage montre que nous avons maintenant 3 rouges, 1 bleu, 1 noir et 1 unité.
Notez que la forme du paquet n'a pas d'importance. Le 3e paquet rouge n'est pas carré. L'important est qu'il contient 4x4x4 unités.
Exercice 2 de la fiche d'exercices.
Dans l'exemple précédent, on pourrait convenir d'utiliser toujours les mêmes couleurs de sorte que le premier nombre (base 10) serait 213 ou bien 132, la couleur permettant de savoir ce que signifie le 2, le 3 et le 1.
Mais c'est peu pratique. À la place on décide d'attribuer une signification à la position du chiffre dans le nombre :
Donc ici nous avons 3 unités (colonne de droite) plus 1×10 (2e colonne à partir de la droite) plus 2x10x10. Donc 213 = 2x10x10 + 1×10 + 3×1.
Ce calcul peut sembler un peu idiot. C'est que l'on est habitué à manipuler la base 10. Mettre ces mécanismes en évidence permet de mieux comprendre le fonctionnement des autres bases.
En base 4 nous avions le nombre 3111 que l'on notera sans couleur 3111. De droite à gauche :
Le nombre est donc égal à 3x4x4x4 + 1x4x4 + 1×4 + 1×1 = 213.
Remarquez que nous ne savons faire ce calcul qu'en base 10. Le calcul 3x4x4x4 + 1x4x4 + 1×4 + 1×1 = 213 est donc un calcul fait en base 10 et le résultat correspond à ce que nous avions trouvé avec la base 10.
Le même nombre est noté 213 en base 10 et 3111 en base 4. Je ne peux pourtant pas écrire 213 = 3111. On convient alors d'indiquer la base en indice : $3111_4$.
On note la base en indice : $3111_4$ est en base 4, $213_{10}$ en décimal.
La base 10 étant notre base « normale », on convient qu'en l'absence d'indication, c'est la base 10 par défaut.
La base 2 et la base 16 ont une importance particulière et bénéficie d'une notation spéciale.
0b1101001.0x3A4.Ces notations supplémentaires sont utilisables en Python :
>>> 0b11101 45 >>> 0x3e 52
Exemple de conversion : 0b101001 = 41.
Exercice 3 de la fiche d'exercices.
Exemple de conversion 0x2B3 = 691
Exercice 4 de la fiche d'exercices.
Comme on l'a dit, on peut, dans un programme, écrire un nombre binaire ou hexadécimal. Par exemple :
>>> 0b101001 41 >>> 0x2B3 691
Mais comment faire depuis un texte ? En effet, il est courant de devoir récupérer un nombre depuis une chaîne de texte : soit parce que le nombre provient d'un fichier texte, soit parce que le nombre provient de input.
Si j'ai un texte en décimal "497" et que je souhaite le transformer entier, c'est simple, il suffit de transtyper avec int :
>>> int("497")
497
Mais si le texte est un nombre en binaire ? Eh bien c'est simple aussi : il suffit de préciser la base :
>>> int("101001", 2)
41
Exemple : Conversion de 201 en binaire. On divise successivement par 2.
On parle de divisions entières, avec reste.
Quand le résultat de la division est 0, on s'arrête et on prend les restes en sens inverse.
201 = 0b11001001
Exercice 5 de la fiche d'exercices.
Par défaut, Python affiche les entiers sous forme décimale. Mais on peut lui demander un affichage dans une autre base en faisant une conversion en chaîne de caractère. Il faut pour cela utiliser un formatage.
>>> "Le nombre est {}".format(497)
'Le nombre est 497'
>>> "Le nombre est {:b}".format(497)
'Le nombre est 111110001'
>>> "Le nombre est {:012b}".format(497)
'Le nombre est 000111110001'
>>> "Le nombre est {:x}".format(497)
'Le nombre est 1f1'
format est inscrit dans les {}. Comme on n'a rien précisé entre les {}, on se contente de transformer le 497 en texte, donc en décimal.{:b}, ce sera donc du binaire.{:012b} indique que l'on veut du binaire avec 12 chiffres complétés à gauche par des 0 si besoin.{:x} indique que l'on veut de l'hexadécimal.Les options de formatage sont nombreuses et puissantes.
Seulement à partir de Python 3.5
C'est la même chose mais en plus confortable : au lieu d'écrire .format après la chaîne, on place un f avant la chaîne. Les commandes précédentes deviennent :
>>> f"Le nombre est {497}"
'Le nombre est 497'
>>> f"Le nombre est {497:b}"
'Le nombre est 111110001'
>>> f"Le nombre est {497:012b}"
'Le nombre est 000111110001'
>>> f"Le nombre est {497:x}"
'Le nombre est 1f1'
J'ai utilisé 497 comme exemple, mais on pourrait mettre partout le nom d'une variable contenant un entier.
>>> a = 442 * 3
>>> f"Le résultat en hexa est {a:x}"
'Le résultat en hexa est 52e'
Pourquoi utiliser l'hexadécimal ? Il n'est pas utile pour la machine qui ne comprend que le binaire et il ne semble pas utile pour nous qui préférons les décimal…
Le fait que $16 = 2^4$ (alors que 10 n'est pas une puissance de 2) fait que la conversion binaire ↔ hexadécimal est très simple. De plus, un nombre écrit en hexadécimal sera beaucoup plus court et simple à manipuler pour un humain. L'hexadécimal est une manière commode, pour l'humain, de manipuler des nombres binaires.
Exercice 9 de la fiche d'exercices.
Pour passer de l'hexadécimal au binaire ou réciproquement, ne passez pas par le décimal ! Cela irait à l'encontre de ce qui fait l'intérêt de l'hexadécimal. La conversion doit se faire de tête, rapidement, sans calcul.
Ci-dessus, l'exemple de 0b10110001101001. On regroupe les chiffres par 4 en partant de la droite. On ajoute des 0 à gauche au besoin. Chaque bloc de 4 correspond à un symbole hexadécimal.
Par exemple, $1100_b = 12 = C_x$.
Dans l'exemple, 0b10110001101001 = 0x2C69 et il n'est pas utile de savoir ce que cela vaut en décimal !
Le plus petit élément de mémoire dans une machine est un chiffre binaire : le binary element, le bit.
Il faut plusieurs chiffres pour former des nombres. On regroupe donc les bits pour former des mots binaires.
On préfère parler de mot binaire que de nombre binaire. En effet, ces groupes de bits peuvent représenter des choses très diverses et ils ne correspondent pas forcément à des nombres. Dans une machine, les images, les textes, les sons… tout est représenté en binaire.
En 1956, Werner Buchholz désigne le mot binaire par une « bouchée », soit bite en anglais. Ce mot étant trop proche de bit, il le déforme en Byte. Le Byte ne contenait pas forcément 8 bits à l'époque. L'usage s'est répandu d'utiliser des mots de 8 bits si bien que petit à petit, Byte est devenu synonyme d' octet.
La technologie a fait de l'octet la mesure de base. Aujourd'hui encore le chiffre 8 revient beaucoup. Par exemple les consoles de jeux de 3e génération vers 1983 étaient en 8 bits – NES, Sega Master System, Atari 7800. Cela signifie qu'à chaque lecture de la mémoire, on obtenait un mot de 8 bits, un octet.
Puis mes console de 4e génération vers 2000 étaient en 16 bits – Super NES, Méga Drive…
Ensuite à la 5e génération, on passe à 32 et 64 bits – Nintendo 64, Playstation…
Exercice 8 de la fiche d'exercices
En Python, les entiers, int occupent 4 octets. Ils pourraient donc aller en principe de 0 à $2^{32}-1$. Mais la représentation des nombres entiers n'est pas en binaire naturel. En effet, il faut pouvoir représenter le symbole – pour les nombres négatifs ! Donc les entiers pourront aller de $-2^{31}$ à $2^{31}-1$ – cf. cours sur les entiers négatifs.
Mais Python étant un langage très confortable, si on fait un calcul nécessitant des entiers plus grands, il passe automatiquement dans un format d'entiers de taille arbitraire qui utilise autant d'octets que nécessaire. Le calcul s'en trouve ralenti, il ne faut donc pas en abuser, mais c'est très pratique pour certains calculs mathématiques !
>>> 2**100 1267650600228229401496703205376
En informatique, on aime utiliser les puissances de 2 et on sait que $2^{10} = 1024 \simeq 1000$ ce qui a amené des confusions.
Les organismes de normes on donc défini en 1998 :
La confusion perdure néanmoins et on peut parfois lire Ko à la place de kio .
L'usage est également de noter B pour Byte et b pour bit. Il ne faut donc pas confondre kB et kb.
Enfin, il faut utiliser k pour kilo, même si on voit souvent écrit K à la place.
Exercice 10 de la fiche d'exercices.