Adloun

Représenter les entiers

Cours · NSI (première), chapitre 1 · première, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun

La représentation binaire d'un entier : 1 fois 64, plus 1 fois 32, plus 1 fois 4, plus 1 fois 1 donne 101.

« Toute machine informatique manipule une représentation des données dont l'unité minimale est le bit 0/1, ce qui permet d'unifier logique et calcul. » — Programme de NSI, rubrique Représentation des données : types et valeurs de base

Une machine ne sait pas ce qu'est le nombre douze. Elle sait mettre un fil sous tension ou l'y laisser, aimanter une plage de disque dans un sens ou dans l'autre, laisser passer un courant ou le bloquer. Deux états, rien de plus. Tout le reste — les entiers, les textes, les images, les sons — se construit sur ce choix binaire, et ce chapitre construit le premier étage : les entiers.

1.1 Compter dans une base quelconque

1.1.1 Ce que veut dire « écrire un nombre »

Écrire en base dix, c'est décider que le chiffre le plus à droite compte les unités, son voisin les dizaines, le suivant les centaines : . La base dix n'a rien de nécessaire ; elle vient de nos dix doigts. Remplaçons dix par un entier quelconque, et le mécanisme tient encore.

Définition 1.1Écriture en base

Soit un entier. Écrire l'entier en base , c'est le donner sous la forme

où les chiffres sont des entiers vérifiant , et où le chiffre de poids fort est non nul. On note cette écriture .

◆Théorème 1.2Existence et unicité de l'écriture

Pour tout entier et tout entier , il existe une écriture de en base , et une seule.

Ce théorème dit une chose simple, qu'il vaut la peine de voir écrite : dans une écriture positionnelle, ce n'est pas le chiffre seul qui compte, mais le chiffre et sa place.

Figure : L'écriture positionnelle en base . Chaque position porte une puissance de — son poids — et le nombre est la somme des chiffres multipliés par leur poids.
Démonstration

Existence. Procédons par divisions euclidiennes successives. Posons , puis tant que , écrivons la division euclidienne avec . La suite est strictement décroissante d'entiers positifs — car dès que et — donc elle atteint en un nombre fini d'étapes. En remontant les substitutions, on obtient bien .

Unicité. Supposons deux écritures d'un même . Le chiffre est le reste de la division de par : il est donc déterminé de façon unique. En retranchant et en divisant par , on est ramené au même problème pour , strictement plus petit. Une descente finie conclut.

La démonstration ne fait pas que prouver : elle donne l'algorithme. Les restes successifs de divisions par sont les chiffres, lus de droite à gauche.

Capacité attendue

« Passer de la représentation d'une base dans une autre. »

1.1.2 De la base vers la base dix

Le sens facile. On applique la définition — mais pas naïvement. Écrire en calculant chaque puissance séparément coûte cher ; on préfère factoriser :

Cette réécriture s'appelle le schéma de Horner. Elle transforme le calcul en une seule boucle : partir de zéro, et pour chaque chiffre lu de gauche à droite, multiplier par puis ajouter le chiffre.


CHIFFRES = "0123456789ABCDEF"

def depuis_base(s, b):
    """Valeur de l'entier écrit s en base b (2 <= b <= 16).

    Précondition : s ne contient que des chiffres valides en base b.
    """
    n = 0
    for c in s:
        n = n * b + CHIFFRES.index(c)
    return n
Exemple 1.3Lecture pas à pas

Calculons depuis_base("1011", 2). La variable n vaut successivement , puis , puis , puis , puis . On retrouve bien .

1.1.3 De la base dix vers la base

Le sens que donne la démonstration : diviser, garder le reste, recommencer sur le quotient. Les restes sortent dans l'ordre inverse de l'écriture, d'où la construction de la chaîne par la gauche.


def vers_base(n, b):
    """Écriture de l'entier n >= 0 en base b (2 <= b <= 16), sous forme de chaîne."""
    if n == 0:
        return "0"
    s = ""
    while n > 0:
        s = CHIFFRES[n % b] + s
        n = n // b
    return s
Figure : Conversion de en base deux par divisions successives. Le dernier reste obtenu est

le premier chiffre écrit : c'est pourquoi la fonction vers_base construit la

chaîne par la gauche.
Attention

Le cas est traité à part, et ce n'est pas un caprice : la boucle while n > 0 ne s'exécute jamais pour et renverrait la chaîne vide. C'est le genre d'oubli qu'un jeu de tests bien choisi attrape immédiatement — nous y reviendrons au chapitre 3.

Méthode : Vérifier une conversion sans refaire le calcul

Convertir dans un sens puis dans l'autre doit redonner le point de départ. Sur machine : depuis_base(vers_base(n, b), b) == n doit être vrai pour tout et tout admissibles. Cette propriété — deux fonctions inverses l'une de l'autre — vaut mieux qu'une vérification à la main, parce qu'elle se teste sur des milliers de valeurs.

1.2 Les trois bases qui comptent

Le programme privilégie explicitement les bases , et . Ce n'est pas un appauvrissement : ce sont les seules qu'on rencontre en pratique, et la troisième n'existe que pour servir la première.

1.2.1 La base deux

Un seul chiffre binaire s'appelle un bit — de l'anglais binary digit. Un groupe de huit bits forme un octet.

En base deux, les poids sont les puissances de deux : lire un octet ne demande donc aucun calcul, seulement une addition des poids des bits allumés.

Figure : Les huit poids d'un octet. Lire , c'est additionner les poids des bits à : .

Exercices du chapitre

La suite du cours · Tous les exercices du chapitre