Aller au contenu

02bis Exos Représentation entiers Correction

Conversions de nombres entiers positifs⚓︎

Fiche d'exercice sur papier⚓︎

La correction de la fiche 02 est ici :

Correction de la Fiche d'Exercices NSI 02

Fiche 02bis d'exercices⚓︎

Exercice 1 : en Python⚓︎

Les fonctions de conversion existent déjà dans Python (bien sûr !), mais ne les utilisez pas, vous allez les ré-écrire.

Fonctions natives de conversion

hex(25) donne l'écrire hexadécimale de 25, qui en notation python est 0x1b
bin(25) donne l'écriture binaire de 25, qui en notation python est 0b11001
Dans l'autre sens, int() convertit ce qu'il peut, sachant qu'on peut aussi lui indiquer la base (optionnel) :
int(0x6e), int("0x6e", 16), et int("6e", 16) font la même chose : convertir le nombre \(6e_{16}\) en écriture décimale.
De même, int(0b1101110) ou int("1101110", 2)convertissent le nombre \(0b1101110_{2}\) en écriture décimale.

  1. Écrivez en Python une fonction conversion_binaire_to_decimal(nombre) permettant de convertir un nombre binaire vers l'écriture décimale. Le nombre binaire donné en paramètre sera une chaîne de caractère, le nombre décimal retourné sera un int.
  2. Écrivez en Python une fonction conversion_decimal_to_binaire(nombre) permettant de convertir un nombre donné en écriture décimale vers l'écriture binaire.
    Il s'agit d'additionner les puissances de la base, multiplées par le chiffre correspondant :

    🐍 Script Python
    def conversion_to_decimal(base, nombre):
        """base est un entier représentant la base de départ
        nombre est un string représentant le nombre à convertir
        la fonction retourne un entier en décimal"""
        Lchiffres = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
        valeurDecimale = 0
        for i in range(len(nombre)):
            chiffreBase = nombre[-1-i].lower()
            print(chiffreBase)
            chiffreDecimal = Lchiffres.index(chiffreBase)
            valeurDecimale += chiffreDecimal * base**i
        return valeurDecimale
    
        # J'ai présenté cette solution sous la forme d'une fonction
        # On peut maintenant effectuer un calcul en appelant la fonction :
        print(conversion_to_decimal(2, '10101010'))
    

  3. Écrivez en Python une fonction conversion_to_decimal(base, nombre) permettant de convertir un nombre d'une base de départ \(d\) vers l'écriture décimale (\(d\) entre \(2\) et \(16\)).

  4. Écrivez en Python une fonction conversion_from_decimal(base, nombre) permettant de convertir un nombre donné en écriture décimale vers une base d'arrivée \(a\) (\(a\) entre \(2\) et \(16\)).
    Il s'agit d'effectuer des divisions euclidiennes successives, et de garder les restes (dans l'ordre inverse de leur apparition) :

    🐍 Script Python
    def conversion_from_decimal(base, nombre):
        """base est un entier représentant la base d'arrivée
        nombre est un entier à convertir
        la fonction retourne un string qui représente le nombre converti"""
        Lchiffres = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
        valeurBase = ''
        while nombre != 0:
            reste = nombre % base
            valeurBase = Lchiffres[reste] + valeurBase
            nombre = nombre // base
        return valeurBase
    
        # On peut maintenant effectuer un calcul en appelant la fonction :
        print(conversion_from_decimal(2, 145)))
    

  5. On peut maintenant utiliser les fonctions précédentes pour écrire une fonction conversion_base_to_base(d, a, nombre) permettant de convertir un nombre donné en base \(d\) vers une base d'arrivée \(a\) (\(d\) et \(a\) entre \(2\) et \(16\)).

    La conversion d'une base D vers une base A peut simplement passer par l'écriture décimale, en enchaînant une conversion de la base D vers la base 10, puis de la base 10 vers la base A :

    🐍 Script Python
    def conversion_base_to_base(d, a, nombre):
        """d est un entier représentant la base de départ
        a est un entier représentant la base d'arrivée
        nombre est un string représentant le nombre à convertir"""
        nombre_decimal = int(conversion_to_decimal(d, nombre))
        return conversion_from_decimal(a, nombre_decimal)
    

Nouvel entrainement à faire à la main, sur papier :⚓︎

Exercice 2⚓︎

  1. Convertir en binaire les nombres \(397_{10}\), \(133_{10}\), \(110_{10}\).
    \(397 = 198 \times 2 + 1\)
    \(198 = 99 \times 2 + 0\)
    \(99 = 49 \times 2 + 1\)
    \(49 = 24 \times 2 + 1\)
    \(24 = 12 \times 2 + 0\)
    \(12 = 6 \times 2 + 0\)
    \(6 = 3 \times 2 + 0\)
    \(3 = 1 \times 2 + 1\)
    \(1 = 0 \times 2 + 1\)
    donc \(397_{10} = 110001101_{2}\)


    \(133 = 66 \times 2 + 1\)
    \(66 = 33 \times 2 + 0\)
    \(33 = 16 \times 2 + 1\)
    \(16 = 8 \times 2 + 0\)
    \(8 = 4 \times 2 + 0\)
    \(4 = 2 \times 2 + 0\)
    \(2 = 1 \times 2 + 0\)
    \(1 = 0 \times 2 + 1\)
    donc \(133_{10} = 10000101_{2}\)

    \(110 = 55 \times 2 + 0\)
    \(55 = 27 \times 2 + 1\)
    \(27 = 13 \times 2 + 1\)
    \(13 = 6 \times 2 + 1\)
    \(6 = 3 \times 2 + 0\)
    \(3 = 1 \times 2 + 1\)
    \(1 = 0 \times 2 + 1\)
    donc \(110_{10} = 1101110_{2}\)

  2. Convertir en décimal les nombres \(101_2\), \(1010_2\), \(1101010_2\).
    \(101_{2} = 1 \times 2^2 + 0 \times 2^1 + 1\times 2^0 = 4 + 1 = 5\)
    \(1010_{2} = 1010_{2} = 1 \times 2^3 + 0 \times 2^2 + 1\times 2^1 + 0 = 8 + 2 = 10\)
    \(1101010_{2} = 1 \times 2^6 + 1 \times 2^5 + 0 \times 2^4 + 1\times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0\times 2^0 = 64 + 32 + 0 + 8 + 0 + 2 + 0 = 106\)

  3. Vérifier en convertissant pour revenir à la base d’origine.

Exercice 3⚓︎

Convertir en hexadécimal

  1. \(3167_{10}\)
    \(3167 = 197 \times 16 + 15\)
    \(197 = 12 \times 16 + 5\)
    \(12 = 0 \times 16 + 12\)
    donc \(3167_{10} = C5F_{16}\)

  2. \(219_{10}\)
    \(219 = 13 \times 16 + 11\)
    \(13 = 0 \times 16 + 13\)
    donc \(219_{10} = DB_{16}\)

  3. \(6560_{10}\)
    \(6560 = 410 \times 16 + 0\)
    \(410 = 25 \times 16 + 10\)
    \(25 = 1 \times 16 + 9\)
    \(1 = 0 \times 16 + 1\)
    donc \(6560_{10} = 19A0_{16}\)

Exercice 4⚓︎

Convertir en décimal

  1. \(3AE_{16}\)
    \(3AE_{16} = 3\times 16^2 + 10\times 16^1 + 14 \times 16^0 = 942\)

  2. \(FFF_{16}\)
    \(FFF_{16} = 15\times 16^2 + 15\times 16^1 + 15 \times 16^0 = 4095\)

  3. \(6AF_{16}\)
    \(6AF_{16} = 6\times 16^2 + 10\times 16^1 + 15 \times 16^0 = 1711\)

Exercice 5⚓︎

Convertir en base 16

  1. \(128_{10}\)
    \(128 = 8 \times 16 + 0\)
    \(8 = 0 \times 16 + 8\)
    donc \(128_{10} = 80_{16}\)

  2. \(101_{10}\)
    \(101 = 6 \times 16 + 5\)
    \(6 = 0 \times 16 + 6\)
    donc \(101_{10} = 65_{16}\)

  3. \(256_{10}\)
    \(256 = 16 \times 16 + 0\)
    \(16 = 1 \times 16 + 0\)
    \(1 = 0 \times 16 + 1\)
    donc \(256_{10} = 100_{16}\)

  4. \(1001011_2\)
    \(100_2 = 0100_2 = 4_{16}\)
    \(1011_2 = 11_{10} = B_{16}\)
    donc \(1001011_2 = 4B_{16}\)

Exercice 6⚓︎

Convertir en base 10

  1. \(C20_{16}\)
    \(C20_{16} = 12\times 16^2 + 2\times 16^1 + 0 \times 16^0 = 3104\)

  2. \(A2E_{16}\)
    \(A2E_{16} = 10\times 16^2 + 2\times 16^1 + 14 \times 16^0 = 2606\)

Exercice 7⚓︎

Convertir en base 2

  1. \(F0A_{16}\)
    \(F_{16} = 15_{10} = 1111_{2}\)
    \(0_{16} = 0_{10} = 0000_{2}\)
    \(A_{16} = 10_{10} = 1010_{2}\)
    donc \(F0A_{16} = 111100001010\)

  2. \(C01_{16}\)
    \(C_{16} = 12_{10} = 1100_{2}\)
    \(0_{16} = 0_{10} = 0000_{2}\)
    \(1_{16} = 1_{10} = 0001_{2}\)
    donc \(C01_{16} = 110000000001\)