La Base 10 : le système décimal

Vous savez ce qu'est la base 10. Ce sera notre point de départ pour mettre en place les autres bases.

On dispose de 10 symboles : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Le nombre $386$ vous le comprenez aisément depuis maintenant quelques années. $3$ est le chiffre des centaines, $8$ celui des dizaines et 6 celui des unités.

Pour comprendre la suite du cours il faut écrire $386$ autrement :

$386 = 3 \times 10^2 + 8\times 10^1 + 6 \times 10^0$

Ecrire le nombre $5624$ comme dans l'exemple précédent.

Code de déblocage de la correction :

En informatique nous utilisons plusieurs bases, dans ce cours nous nous limiterons à une présentation de la base 2 pour écrire des entiers naturels. Nous verrons dans de prochains cours comment effectuer un certains nombres d'opérations dans cette base.

Nous serons amener également à découvrir l'hexadécimal ainsi que le codage des nombres réels.

La Base 2 : le binaire

Présentation

Le binaire est le système de numération à la source de la conception d'un ordinateur. Les composants d'un ordinateur fonctionnent grâce au courant électrique. L'information est donc à deux états : présence de courant 1 et absence de courant 0.

En binaire les rangs sont appelés bit. Par exemple, le nombre 10011 occupe 5 bits. Là où tout se complique, c'est que comme je l'ai expliqué, chaque rang en binaire ne peut avoir que deux valeurs (binaire = base 2) différentes : 0 ou 1. Pour la base 10, chaque rang représente une puissance de 10, pour la base 2, chaque rang occupe une puissance de 2.

Le système binaire est un système de numération positionnel de base 2 dans lequel seuls les chiffres 0 et 1 peuvent apparaître.

Un bit est l'unité de base du système binaire ne pouvant prendre que deux valeurs : 0 ou 1.
"bit" est la contraction de "binary digit", littéralement "chiffre binaire".

Observer et compléter le tableau suivant qui va vous faire compter en binaire jusqu'à 10 :

Nombre en décimal Décomposition Nombre en binaire
0 $0=\color{red}{0}\times2^0$ $\color{red}{0}$
1 $1=\color{red}{1}\times2^0$ $\color{red}{1}$
2 $2=\color{red}{1}\times 2^1+\color{red}{0}\times2^0$ $\color{red}{1}\color{red}{0}$
3 $3=\color{red}{1}\times 2^1+\color{red}{1}\times 2^0$ $\color{red}{1}\color{red}{1}$
4 $4=\color{red}{1}\times 2 ^2+\color{red}{0}\times2^1+\color{red}{0}\times 2^0$ $\color{red}{1}\color{red}{0}\color{red}{0}$
5
6
7
8
9
10

Code de déblocage de la correction :

Conversion décimale vers binaire

Vous avez maintenant compris la signification d'une écriture en binaire. Reste à mettre en place un algorithme qu nous permettent de faire la conversion d'un nombre écrit en base 10 en base 2.

La division euclidienne, celle que vous avez apprise en CM1, va nous permettre d'établir une méthode de conversion de la base 10 vers la base 2. Cette méthode nous permettra d'écrire un algorithme de conversion aisément.

Procédure de conversion base 10 en base 2

Voici la procédure :

L'écriture binaire de $586$ est donc $\color{red}{1001001010}$.

Convertir en binaire les nombres suivants à l'aide de la méthode euclidienne :

  1. 196.

  2. 119.

  3. 243.

Code de déblocage de la correction :

Conversion binaire vers décimale

On ajoute les valeurs des bits multipliées par 2 monté à la puissance la position du bit.

$11010111_{binaire} = 1\color{red}{\times2^7} + 1\color{red}{\times 2^6} + 0\color{red}{\times 2^5} + 1\color{red}{\times 2^4} + 0\color{red}{\times 2^3}$ $ + 1\color{red}{\times 2^2} + 1\color{red}{\times 2 ^1} + 1\color{red}{\times 2^0}$ $=128+64+16+4+2+1$ $= 215_{décimal}$.
  1. Convertir $10011001_2$ en base 10.

  2. Convertir $10101010101_2$ en base 10.

Code de déblocage de la correction :

Lien entre nombre de bits et amplitude des décimaux à coder

  1. Avec 1 bit, quel est l'ensemble des entiers que l'on peut coder ?

  2. Avec 2 bits, quel est l'ensemble des entiers que l'on peut coder ?

  3. Avec 3 bits, quel est l'ensemble des entiers que l'on peut coder ?

  4. Avec $n$ bits, quel est l'ensemble des entiers que l'on peut coder ?

Code de déblocage de la correction :

nombres "codables" avec $n$ bits

Avec $n$ bits on peut coder les nombres de 0 à $2^{n}-1$. Soit $2^n$ valeurs.


IP(v4)

L'adresse IP, Internet Protocol, est utilisé quand on fait du réseau( se reporter au cours sur le réseau). C'est un numéro d'identification qui est attribué à un élément du réseau.

Dans sa version la plus utilisée, Ipv4, elle est composée de 32 bits soit de 4 octets, 1 octet étant égal à 8 bits.

Il faut savoir manipuler du binaire quand on s'intéresse de près aux réseaux. (cf cours sur le réseau ).

Pour connaître l'adresse IP de votre téléphone, rendez-vous dans le menu « Paramètres » ou « Réglages » puis dans « A propos du téléphone ». Cliquez ensuite sur « Etat », l'adresse IP de votre téléphone sera alors affichée avec les autres informations telles que le numéro IMEI .

Pour connaître celle de votre ordinateur, aller dans l'invite de commande (en tapant cmd dans la barre de recherche) puis saisir la commande ipconfig.

  1. Écrire l'adresse IP de votre smartphone ou de votre ordinateur.

  2. Que remarquez-vous sur la plage de valeurs à laquelle appartiennent les nombres apparaissant des les adresses IPv4 visibles ?

  3. Est-ce cohérent par rapport à l'exercice précédent sachant que chaque correspond à un nombre décimal écrit en binaire sur un seul octet ?

  4. Écrire en binaire les adresses IP de vos smartphones.

Code de déblocage de la correction :

Conversion base 2 à base 10 et réciproquement en Python

L'objectif de cette partie est la réalisation de fonctions de conversion de binaire en décimal et réciproquement.

Ces exercices sont difficiles pour l'instant au vu de vos connaissances en Python, mais il est essentiel que vous maîtrisiez ces programmes à long terme.
N'hésitez pas à vous servir des aides proposées en cas de difficultés.

Le but de cet exercice est d'écrire une fonction decbin qui prend comme argument un entier n et qui renvoie une liste l qui correspond à l'écriture de n en binaire.

Voici des opérateurs et des méthodes sur les listes qui peuvent vous être utiles :

  1. Tester les deux méthodes append et reverse portant sur des listes en exécutant le code suivant :

    l = [-15, -20, 2.2, 100, 9]
    print("liste initiale", l)
    l.append(4.51)
    print("liste après append", l)
    l.reverse()
    print("liste après reverse", l)
  2. Écrire une fonction decbin qui prend comme argument un entier non nul n et qui renvoie une liste l qui correspond à l'écriture de n en binaire. br Pour cela, il "suffit" d'écrire en langage Python la démarche vue au 2.2 pour convertir l'écriture décimale d'un nombre vers son écriture décimale.

    Tester entre autres avec les cas suivants :

    print(decbin(2))       # doit afficher [1, 0]
    print(decbin(11))      # doit afficher [1, 0, 1, 1]
    print(decbin(22611))   # doit afficher [1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1]
Aides possibles en cas de difficultés :

Voici une vidéo pour mieux comprendre comment se servir des opérateurs et méthodes proposées :

Voici les étapes à suivre pour réaliser le programme :

  1. Commencer par écrire l'en-tête de la fonction decbin en n'oubliant pas le paramètre.

  2. Créer une liste vide, en Python [], qui stockera progressivement la liste des restes obtenus.

  3. Effectuer une boucle répétitive en repérant quelle est la condition d'arrêt de la procédure du 2.2.

  4. Calculer le quotient et le reste de le division euclidienne par 2.

  5. Rajouter dans la liste le nouveau nombre à considérer.

  6. Faire en sorte que qu'au tour suivant le quotient soit pris en compte dans la division euclidienne.

  7. Penser à inverser la liste des restes avant le renvoi final.

  8. Ne pas oublier de tester la fonction decbin à l'aide des trois tests proposés.

En cas de difficultés, en cliquant ici, il est possible d'obtenir un code à trous à compléter.

Copier puis compléter le script suivant en vous servant des commentaires et des tests proposés ci-dessus.

def decbin(n: int) -> list:
    resultat = []       # liste vide qui stockera les éléments de l'écriture binaire
    while ...:          # tant que le nombre à diviser n'est pas nul
        # division euclidienne
        quotient = ...   
        reste = ...     
        resultat.append(...) # ajout en fin de liste
        n = ...
    resultat....        # pour lire la liste des restes en remontant
    return ... 

Attention ! Il y a d'autres manières d'écrire le script demandé, manières tout aussi pertinentes que celle proposée ci-dessus avec des trous.

Code de déblocage de la correction :

La fonction native bin permet d'obtenir directement la conversion d'un nombre décimal en son écriture binaire.

bin(22611) renvoie 0b101100001010011 ; les deux premiers caractères 0b signifie qu'on obtient l'écriture du nombre en binaire tandis que les caractères suivants donnent l'écriture binaire du nombre 22611 : 101100001010011.

Évidemment, la fonction bin ne pourra pas être directement utilisée en évaluation ou à l'épreuve pratique du bac si le but de l'exercice est de créer une fonction convertissant l'écriture décimale d'un nombre en son écriture binaire.

Le but de cet exercice est d'écrire une fonction convertissant l'écriture binaire d'un nombre en son écriture décimale.

  1. Écrire une fonction bindec qui a pour paramètre une liste l correspond à un entier écrit en binaire et qui renvoie l'entier en décimal.

    Pour obtenir l'élément en position i d'une liste liste, il suffit en python d'écrire l'expression liste[i].
    Attention ! le premier élément de la liste a pour position (=index) 0.

  2. Tester entre autres avec les cas suivants :

    print(bindec([1, 0, 1])) # doit afficher 5
    print(bindec([1, 1, 0, 1, 0])) # doit afficher 26
Aides possibles en cas de difficultés :

Voici les étapes à suivre pour réaliser le programme :

  1. Commencer par écrire l'en-tête de la fonction decbin en n'oubliant pas le paramètre.

  2. Initialiser une variable qui stockera le résultat attendu.

  3. Effectuer une boucle répétitive pour balayer les bits de la liste successivement en prenant en compte leur position.

  4. Récupérer la valeur du bit correspondant à cette position.

  5. Calculer le poids de ce bit en s'aidant de la procédure du 2.3.

  6. modifier la variable qui stocke le résultat attendu.

  7. Ne pas oublier de tester la fonction bindec à l'aide des deux tests proposés.

En cas de difficultés, en cliquant ici, il est possible d'obtenir un code à trous à compléter.

Copier puis compléter le script suivant en vous servant des commentaires et des tests proposés ci-dessus.

def bindec(liste: list) -> int:
    nb_decimal = ...    # Initialisation de la variable stockant le résultat attendu
    liste...            # inversion pour considérer les bits par poids croissant
    for i in range(...):# balayage des éléments de la liste en considérant leur position
        bit = ...         # élément de la liste en position i
        poids = ...       # poids associé au bit en position i
        nb_decimal = ...  
    return nb_decimal 

Attention ! Il y a d'autres manières d'écrire le script demandé, manières tout aussi pertinentes que celle proposée ci-dessus avec des trous.

Code de déblocage de la correction :

Il est possible de convertir du décimal vers le binaire en utilisant des chaînes de caractères plutôt que des listes.

  1. Compléter la fonction decbin2 qui prend en paramètre un entier positif n en écriture décimale et qui renvoie son écriture binaire sous la forme d'une chaîne de caractères.

    def ... -> str: 
        bin_n = ... 
        n = ... 
        while ...: 
            bin_n = ... + bin_n
            n = ... 
        return ...

    La fonction str permet de transtyper un entier sous forme d'une chaîne de caractères.

  2. Tester la fonction decbin2 en vous aidant des exemples suivant :

    print(dec_to_bin(0))        # affiche '0'
    print(dec_to_bin(78))       # affiche '1001110'             
    print(dec_to_bin(203))      # affiche '11001011'             

Code de déblocage de la correction :

Exercice

Un jeu vidéo est hébergé sur six différents serveurs à travers le monde. Les joueurs sont automatiquement dirigés vers un des serveurs suivant leur adresse IPv4.

Voici la répartition des directions des joueurs suivant le nombre correspondant au premier octet de l'adresse IP.

  1. Le joueur nommé G-Aime a une adresse publique de premier octet $11011001$.
    Déterminer l'écriture décimale de cet octet.

  2. Vers quel serveur sera dirigé le joueur G-Aime au vu de son adresse IP ?

  3. Les adresses IP dont le premier octet est compris entre 224 et 255 ne peuvent pas être attribuées à un ordinateur sur Internet.
    En effet, les adresses IP dont le premier octet est compris entre 224 et 239 sont réservées pour envoyer des messages d'un émetteur vers tout un groupe de machines ; on parle de multidiffusion. Elles ne peuvent donc pas être attribuées comme adresse IP à un ordinateur quelconque sur Internet. La multidiffusion est utilisée, entre autres, par les applications permettant les visioconférences.
    Les adresses IP dont le premier octet est compris entre 240 et 255 sont réservées à un usage expérimental et ne sont pas destinées à l'Internet public : ces adresses ne sont par routables sur le réseau Internet.
    Déterminer l'écriture binaire de $240$.

  4. Quelle est la caractéristique commune à l'écriture binaire de tous les nombres compris entre 240 et 255 ?

  5. Combien d'adresses IP différentes sont possibles en restreignant le premier octet entre 0 et 223 ?

Code de déblocage de la correction :

Un site pour s'entraîner.

Un site utilisé en IUT. Attention cet excellent site d'entraînement va plus loin que le programme de NSI.

Le lien pour le site

QCM

Questions issues de la Banque Nationale de Sujets

Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC

Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).

Quelle est la représentation binaire de l'entier positif 51 sur 8 bits ?

Réponses :

A- 0010 0001

B- 0010 1001

C- 0011 0001

D- 0011 0011

Quelle est la représentation binaire de l'entier 152 ?

Réponses :

A- 0001 1001

B- 0011 1010

C- 0100 0100

D- 1001 1000

Quelle est l'écriture décimale de l'entier qui s'écrit 1010 en binaire ?

Réponses :

A- 5

B- 10

C- 20

D- 22

Quel est le plus grand entier positif (non signé) représentable en binaire sur 2 octets (c'est-à-dire 16 bits) ?

Réponses :

A- $2^{15}-1$

B- $2^{15}$

C- $2^{16}-1$

D- $2^{16}$

Combien d'entiers positifs ou nuls (entiers non signés) peut-on représenter en machine sur 32 bits ?

Réponses :

A- $2^{32}-1$

B- $2^{32}$

C- $2\times 32$

D- $32^{2}$

En ajoutant trois chiffres 0 à droite de l'écriture binaire d'un entier $N$ strictement positif, on obtient l'écriture binaire de :

Réponses :

A- $6\times N$

B- $8\times N$

C- $1000\times N$

D- aucune des réponses précédentes

Quel est le nombre minimal de bits nécessaire pour représenter l'entier positif 79 en binaire ?

Réponses :

A- 2

B- 6

C- 7

D- 8

Voici les écritures binaires de quatre nombres entiers positifs.
Lequel est pair ?

Réponses :

A- 10 0001

B- 10 0010

C- 11 0001

D- 11 1111

Parmi les propositions suivantes, laquelle est la représentation binaire de 753 ?

Réponses :

A- 10 0111 1001

B- 10 1111 0001

C- 11 1100 1101

D- 11 1110 0101

Quel est le nombre entier positif dont la représentation binaire est 0010 0011 ?

Réponses :

A- 19

B- 33

C- 35

D- 64

Soit $n$ l'entier positif dont l'écriture binaire est 10001. Quelle est l'écriture binaire de l'entier $2n$ ?

Réponses :

A- 20002

B- 100010

C- 010001

D- 1000110001

Combien de nombres entiers positifs peut-on coder en binaire sur 4 bits ?

Réponses :

A- 4

B- 16

C- 64

D- 256

Combien de valeurs entières positives ou nulles un octet peut-il représenter ?

Réponses :

A- 2

B- 8

C- 16

D- 256

Quelle est l’écriture décimale de l’entier dont la représentation en binaire non signé est 0001 0101 ?

Réponses :

A- 15

B- 21

C- 111

D- 420

Dans l’algorithme ci-dessous, qui prend en entrée un entier naturel non nul et renvoie son écriture binaire, remplacer les pointillés par l’opérateur qui convient.

def cascade(n):
    chiffres = ''
    while n != 0:
        chiffres = str(n … 2) + chiffres
        n = n //2
    return chiffres 

Réponses :

A- //

B- +

C- *

D- %

Autres QCM

Les QCM suivants sont issus de https://genumsi.inria.fr.

(Auteur Christophe BEASSE)

Combien de chiffres binaires sont nécessaires pour coder le nombre 287 ?

Réponses :

A- 7

B- 8

C- 9

D- 10

(Auteur Christophe BEASSE)

Avec 5 bits, on peut compter de .... à .... ?

Réponses :

A- 0 à 31

B- 1 à 32

C- 0 à 32

D- 1 à 31

(Auteur AUDE DURAND SENTER)

Avec une mémoire de 16 bits, on peut coder tous les entiers naturels de :

Réponses :

A- 0 à 15

B-0 à 255

C- 0 à 65 535

D- 0 à 4 294 967 295

Demander le programme !

  1. définir le système décimal.
  2. définir le système binaire.
  3. définir un bit.
  4. définir un octet
  5. définir l'IP(v4)
  1. la conversion à la main d'un nombre binaire et son écriture décimale.
  2. la conversion à la main d'un nombre entier naturel écrit sous forme décimal et son écriture binaire.
  3. écrire un programme permettant de passer de l'écriture binaire d'un nombre à celle décimale.
  4. écrire un programme permettant de passer de l'écriture décimale d'un nombre à celle binaire.
  5. l'estimation de l'amplitude des nombres codables avec un nombre de bits donné

Licence Creative Commons
Les différents auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International