Chapitre 1 : Nombres, binaires et octets.

Introduction :

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 ?

1. Introduction :

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.

2. Écriture en base

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 $$

3. Notation

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.

4. De la base 2 vers la base 10

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$$

Saisis un nombre binaire (des 0 et des 1) puis clique sur Animer ou Pas à pas.

5. Exercice : conversions entre bases.

À faire dans le cahier.

Convertir :

  1. \(10_2\) en base 10.
  2. \(1001_2\) en base 10.
  3. \(1011001_2\) en base 10.
  4. \(101011010_2\) en base 10.

6. Base 2 vers base 10 :

Veuillez entrer une valeur numérique.

7. Exercice : conversion d'un bit en base 10.

À faire dans le cahier.

Quel est le but du code suivant ?

def un_bit_vers_base_10(binaire): if binaire == "0": return 0 elif binaire == "1": return 1


    
>>>

8. Exercice : conversion de plusieurs bits en base 10.

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 :

  1. Créer en Python une fonction qui se nomme 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.
  2. Créer en Python une fonction qui se nomme 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.
def un_bit_vers_base_10(binaire): if binaire == "0": return 0 elif binaire == "1": return 1 def deux_bits_vers_base_10(binaire): if binaire == "00": return 0 elif binaire == "01": return 1 elif binaire == "10": return 2 elif binaire == "11": return 3 def trois_bits_vers_base_10(binaire): pass # à compléter def quatre_bits_vers_base_10(binaire): pass # à compléter trois_bits = "101" quatre_bits = "1101" print(f"{trois_bits} écrit en base 2 est égal à {trois_bits_vers_base_10(trois_bits)} en base 10.") print(f"{quatre_bits} écrit en base 2 est égal à {quatre_bits_vers_base_10(quatre_bits)} en base 10.")


    
>>>

9. Exercice : conversion utilisant les autres fonctions.

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 :

def quatre_bits_vers_base_10(binaire): pass # à compléter def cinq_bits_vers_base_10(binaire): if binaire[0] == "0": return ........................... else: return ..... + .................. cinq_bits = "11101" print(f"{cinq_bits} écrit en base 2 est égal à {cinq_bits_vers_base_10(cinq_bits)} en base 10.")


    
>>>

10. Exercice : conversion d'un binaire de longueur quelconque.

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.

def binaire_vers_base_10(binaire): longueur = len(binaire) somme = ........ for i in range(longueur): bit = binaire[i] bit = int(......) somme += ...... * 2 ** (longueur - i - 1) return somme binaire = "1100101001010010" print(f"{binaire} écrit en base 2 est égal à {binaire_vers_base_10(binaire)} en base 10.")


    
>>>

11. Exercice : fonction de conversion de la base 10 vers la base 2.

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.

def base_10_vers_binaire_basique(x): if x == 0: return "0" elif x == 1: return "1" elif ... ... ... ... nombre = 5 print(f"{nombre} s'écrit {base_10_vers_binaire_basique(nombre)} en base 2.")


    
>>>

12. Algorithme de conversion

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.

Choisis un nombre puis clique sur Animer ou Pas à pas.
⛔ Condition d'arrêt : le quotient vient d'atteindre 0, on ne peut plus diviser : l'algorithme s'arrête.

13. Exercice : conversions manuelles vers la base 2.

À faire dans le cahier.

À l'aide de la méthode précédente :

  1. Convertir \(12\) en base 2.
  2. Convertir \(14\) en base 2.
  3. Convertir \(120\) en base 2.
  4. Convertir \(51\) en base 2.
  5. Convertir \(1 345\) en base 2.

14. Base 10 vers base 2 :

Veuillez entrer une valeur écrite en binaire, sans 0 inutile.

15. Exercice : écriture binaire d'une adresse IP.

À 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.

16. Exercice : (issue de l'épreuve pratique de NSI, sujet 38 - 2025 )

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'
def binaire(a): '''convertit un nombre entier a en sa representation binaire sous forme de chaine de caractères.''' if a == 0: return ... bin_a = ... while ... : bin_a = ... + bin_a a = ... return bin_a nombre = 5 print(f"{nombre} s'écrit {binaire(nombre)} en base 2.")


    
>>>

17. Hexadecimal

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}\).

18. Exercice : conversions entre base 16 et base 10.

À faire dans le cahier.

Convertir :

  1. \(1A_{16}\) en base 10.
  2. \(13E_{16}\) en base 10.
  3. \(4EA2_{16}\) en base 10.
  4. \(101_{16}\) en base 10.
  5. \(16\) en base 16.
  6. \(35\) en base 16.
  7. \(108\) en base 16.
  8. \(1 345\) en base 16.

19. Exercice : conversion d'un caractère hexadécimal en base 10.

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
def caractere_hexa_vers_base_10(carac): ... caractere = "B" print(f"Le nombre {caractere} écrit en base 16 est égal à {caractere_hexa_vers_base_10(caractere)} en base 10.")


    
>>>

20. Exercice : conversion de la base 16 vers la base 10.

Compléter la fonction ci-dessous. Celle-ci utilisera la fonction caractere_hexa_vers_base_10 de l'exercice précédent.

def caractere_hexa_vers_base_10(carac): # copié-collé ici la fonction de l'exercice précédent def base_16_vers_base_10(hexa): longueur = len(....) somme = .... for i in range(longueur): valeur = .........(hexa[i]) somme += ..... * 16 ** (longueur - i - 1) return somme nombre_en_hexadecimal = "B0AD3" print(f"Le nombre {nombre_en_hexadecimal} écrit en base 16 est égal à {base_16_vers_base_10(nombre_en_hexadecimal)} en base 10.")


    
>>>

21. Notation

Un octet (Byte en anglais) est une succession de 8 bits.

22. Exercice : capacité d'un octet.

À faire dans le cahier.

  1. Comment s'écrit le nombre \({0000~0000}_2\) en base 10 ?
  2. Comment s'écrit le nombre \({1111~1111}_2\) en base 10 ?
  3. Combien de nombres entiers distincts peut contenir un octet ?

23. Hexadecimal

Lorsqu'un nombre est écrit en base 16, on parle d'écriture en hexadécimal.

24. Conversion de la base 2 à 16 et réciproquement:

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.

25. Exemple

Donc :

26. Exercice : conversion entre base 2 et base 16.

À faire dans le cahier.

Convertir :

  1. \(BA_{16}\) en base 2.
  2. \(23E_{16}\) en base 2.
  3. \(4A2_{16}\) en base 2.
  4. \(1111~0101_{2}\) en base 16.
  5. \(1100~1011_{2}\) en base 16.
  6. \(0110~0011_{2}\) en base 16.
  7. \(1000~1001~0110~0011_{2}\) en base 16.

27. Exercice : addition et soustraction en base 16 et en base 2.

À faire dans le cahier.

Poser et effectuer les opérations suivantes :

  1. \(3BA_{16} + E6_{16}\).
  2. \(BA_{16} - E_{16}\).
  3. \(BAE_{16} - AA5_{16}\).
  4. \(101~111_{2} + 10~101_{2}\).
  5. \(101~000~001_{2} - 10~111_{2}\).

28. Binaire signé et non signé

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

29. Binaire non signé

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

30. Binaire signé

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

31. Exemple

Essayons de trouver l'écriture du nombre -20 sur un octet.

  1. L'écriture de 20 en base 2 écrit sur un octet est 0001 0100
  2. Son complément à 2 est 1110 1011
  3. On ajoute 1 : 1110 1100

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} $$

32. Exercice : représentation signée et non signée sur un octet.

À faire dans le cahier.

Donner la représentation sur un octet des nombres suivants :

  1. 24 en binaire non signé
  2. 24 en binaire signé
  3. -38 en binaire signé
  4. -1 en binaire signé

Puis :

  1. Quel est le nombre représenté par l’octet 1100 0001 en binaire non signé ?
  2. Quel est le nombre représenté par l’octet 1100 0001 en binaire signé ?

33. Nombres décimaux et réels

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}$$

34. Exemple

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} $$

35. De la base 10 à la base 2 pour les nombres décimaux : les problèmes arrivent.

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.

36. Exemples

  1. 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} $$
  2. 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}\)

37. Nombres à virgule fixe ou à virgule flottante

En ce qui concerne les nombres décimaux, en informatique nous pouvons avoir deux approches :

38. Base 16 vers base 10 :

Veuillez entrer une valeur numérique en base 10.

39. Base 10 vers base 16 :

Entrez la valeur en base 16, en MAJUSCULES, sans zéro inutile (ex. A, 1F, 2A3).

40. Addition en base 2 :

Entrez la somme en binaire, sans zéro inutile en tête.

41. Soustraction en base 2 :

Entrez la différence en binaire, sans zéros inutiles en tête (utilisez uniquement 0 et 1).