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.
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.
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 |
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.
Voici la procédure :
On divise le nombre à convertir par 2. On note le reste de la division (soit 1 soit 0).
On divise le quotient de la division précédente par 2, et on note à nouveau le reste.
On répète ce procédé, jusqu'à ce que le quotient soit 0.
On obtient alors l'encodage en binaire en lisant les restes du dernier au premier.
$586=293\times 2 +0$ donc le reste vaut $\color{red}{0}$.
$293=146\times 2+1$ donc le reste vaut $\color{red}{1}$.
$146=73\times 2 +0$ donc le reste vaut $\color{red}{0}$.
$73=36\times 2 +1 $ donc le reste vaut $\color{red}{1}$.
$36=18\times 2 +0$ donc le reste vaut $\color{red}{0}$.
$18=9\times2+0$ donc le reste vaut $\color{red}{0}$.
$9=4\times2 +1$ donc le reste vaut $\color{red}{1}$.
$4=2\times 2 +0$ donc le reste vaut $\color{red}{0}$.
$2=1\times 2 +0$ donc le reste vaut $\color{red}{0}$.
$1=0\times 2 +1$ donc le reste vaut $\color{red}{1}$.
Le quotient est nul, l'algorithme s'arrête.
L'écriture binaire de $586$ est donc $\color{red}{1001001010}$.
Convertir en binaire les nombres suivants à l'aide de la méthode euclidienne :
196.
119.
243.
On ajoute les valeurs des bits multipliées par 2 monté à la puissance la position du bit.
Convertir $10011001_2$ en base 10.
Convertir $10101010101_2$ en base 10.
Avec 1 bit, quel est l'ensemble des entiers que l'on peut coder ?
Avec 2 bits, quel est l'ensemble des entiers que l'on peut coder ?
Avec 3 bits, quel est l'ensemble des entiers que l'on peut coder ?
Avec $n$ bits, quel est l'ensemble des entiers que l'on peut coder ?
nombres "codables" avec $n$ bits
Avec $n$ bits on peut coder les nombres de 0 à $2^{n}-1$. Soit $2^n$ valeurs.
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.
Écrire l'adresse IP de votre smartphone ou de votre ordinateur.
Que remarquez-vous sur la plage de valeurs à laquelle appartiennent les nombres apparaissant des les adresses IPv4 visibles ?
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 ?
Écrire en binaire les adresses IP de vos smartphones.
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 :
a%b
renvoie le reste de la division euclidienne de a
par b
.
a//b
renvoie le quotient de la division euclidienne de a
par b
.
l.append(a)
permet d'ajouter l'élément a
en fin de liste l
.
l.reverse()
inverse les éléments d'une liste l
.
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)
É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]
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 :
Commencer par écrire l'en-tête de la fonction decbin
en n'oubliant pas le paramètre.
Créer une liste vide, en Python []
, qui stockera progressivement
la liste des restes obtenus.
Effectuer une boucle répétitive en repérant quelle est la condition d'arrêt de la procédure du 2.2.
Calculer le quotient et le reste de le division euclidienne par 2.
Rajouter dans la liste le nouveau nombre à considérer.
Faire en sorte que qu'au tour suivant le quotient soit pris en compte dans la division euclidienne.
Penser à inverser la liste des restes avant le renvoi final.
Ne pas oublier de tester la fonction decbin
à l'aide
des trois tests proposés.
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.
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.
É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.
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
Voici les étapes à suivre pour réaliser le programme :
Commencer par écrire l'en-tête de la fonction decbin
en n'oubliant pas le paramètre.
Initialiser une variable qui stockera le résultat attendu.
Effectuer une boucle répétitive pour balayer les bits de la liste successivement en prenant en compte leur position.
Récupérer la valeur du bit correspondant à cette position.
Calculer le poids de ce bit en s'aidant de la procédure du 2.3.
modifier la variable qui stocke le résultat attendu.
Ne pas oublier de tester la fonction bindec
à l'aide
des deux tests proposés.
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.
Il est possible de convertir du décimal vers le binaire en utilisant des chaînes de caractères plutôt que des listes.
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.
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'
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.
Les joueurs dont le premier octet est compris entre 0 et 37 inclus sont dirigés vers le serveur A.
Les joueurs dont le premier octet est compris entre 38 et 76 inclus sont dirigés vers le serveur B.
Les joueurs dont le premier octet est compris entre 77 et 125 inclus sont dirigés vers le serveur C.
Les joueurs dont le premier octet est compris entre 126 et 164 inclus sont dirigés vers le serveur D.
Les joueurs dont le premier octet est compris entre 165 et 199 inclus sont dirigés vers le serveur E.
Les joueurs dont le premier octet est compris entre 200 et 223 inclus sont dirigés vers le serveur F.
Le joueur nommé G-Aime a une adresse publique de premier octet $11011001$.
Déterminer l'écriture décimale de cet octet.
Vers quel serveur sera dirigé le joueur G-Aime au vu de son adresse IP ?
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$.
Quelle est la caractéristique commune à l'écriture binaire de tous les nombres compris entre 240 et 255 ?
Combien d'adresses IP différentes sont possibles en restreignant le premier octet entre 0 et 223 ?
Un site utilisé en IUT. Attention cet excellent site d'entraînement va plus loin que le programme de NSI.
Le lien pour le siteProprié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- %
Les QCM suivants sont issus de https://genumsi.inria.fr.
Combien de chiffres binaires sont nécessaires pour coder le nombre 287 ?
Réponses :
A- 7
B- 8
C- 9
D- 10
Avec 5 bits, on peut compter de .... à .... ?
Réponses :
A- 0 à 31
B- 1 à 32
C- 0 à 32
D- 1 à 31
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
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