Langage C/C++

Conversion Hexadécimal en Binaire en Langage C : Exercices Corrigés et Cas Particuliers

La conversion des nombres hexadécimaux en binaire est une compétence essentielle en programmation, notamment en C. Cet article vise à fournir une explication détaillée de cette conversion, suivie d’exercices corrigés et de cas particuliers pour renforcer la compréhension.

1. Introduction à la Conversion Hexadécimal en Binaire

Les nombres hexadécimaux (base 16) sont couramment utilisés en informatique en raison de leur efficacité pour représenter des nombres binaires (base 2). Chaque chiffre hexadécimal correspond exactement à quatre bits binaires.

Table de Correspondance

HexadécimalBinaire
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111

2. Conversion Manuelle

Pour convertir un nombre hexadécimal en binaire, il suffit de remplacer chaque chiffre hexadécimal par son équivalent binaire à 4 bits.

Exemple : Convertir 2F3 en binaire.

  1. 2 en binaire est 0010
  2. F en binaire est 1111
  3. 3 en binaire est 0011

Donc, 2F3 en hexadécimal est 0010 1111 0011 en binaire.

3. Programme en Langage C

Voici un programme en C qui effectue la conversion d’un nombre hexadécimal en binaire.

#include <stdio.h>
#include <string.h>

void hexToBinary(char hex[]) {
    int i = 0;
    printf("Binaire: ");
    while (hex[i]) {
        switch (hex[i]) {
            case '0': printf("0000"); break;
            case '1': printf("0001"); break;
            case '2': printf("0010"); break;
            case '3': printf("0011"); break;
            case '4': printf("0100"); break;
            case '5': printf("0101"); break;
            case '6': printf("0110"); break;
            case '7': printf("0111"); break;
            case '8': printf("1000"); break;
            case '9': printf("1001"); break;
            case 'A':
            case 'a': printf("1010"); break;
            case 'B':
            case 'b': printf("1011"); break;
            case 'C':
            case 'c': printf("1100"); break;
            case 'D':
            case 'd': printf("1101"); break;
            case 'E':
            case 'e': printf("1110"); break;
            case 'F':
            case 'f': printf("1111"); break;
            default: printf("\nCaractère hexadécimal invalide %c", hex[i]);
        }
        i++;
    }
    printf("\n");
}

int main() {
    char hex[100];
    printf("Entrer un nombre hexadécimal: ");
    scanf("%s", hex);
    hexToBinary(hex);
    return 0;
}

4. Exercices Corrigés

Série d’exercices corrigés : convertir l’hexadécimal en binaire

Cette série progressive associe calcul manuel, schématisation, validation des données et programmation en langage C. Chaque correction détaille le passage d’un chiffre hexadécimal vers son groupe de quatre bits.

Niveau 1 : conversion directe Niveau 2 : cas particuliers Niveau 3 : programmation C Niveau 4 : opérations binaires

Principe de conversion

Un chiffre hexadécimal représente exactement quatre chiffres binaires. La conversion consiste donc à décomposer le nombre, convertir chaque symbole, puis réunir les groupes obtenus.

1. Décomposer Identifier séparément chaque chiffre hexadécimal.
2. Convertir Remplacer chaque chiffre par son bloc de quatre bits.
3. Assembler Conserver l’ordre initial des différents groupes binaires.
Hex.BinaireHex.BinaireHex.BinaireHex.Binaire
000004010081000C1100
100015010191001D1101
2001060110A1010E1110
3001170111B1011F1111

Niveau 1 — Maîtriser la conversion directe

1

Conversion d’un nombre à deux chiffres

Comprendre la correspondance chiffre par chiffre.

Consigne : convertir le nombre hexadécimal 7A en binaire.
Afficher la correction détaillée
7 0111
+
A 1010
  1. Le chiffre 7 correspond à 0111.
  2. La lettre A représente la valeur décimale 10 et correspond à 1010.
  3. Les deux blocs sont assemblés dans leur ordre initial.
Résultat : 7A₁₆ = 0111 1010₂
2

Conversion d’un nombre à trois chiffres

Assembler trois groupes binaires de quatre bits.

Consigne : convertir 3D5 en binaire.
Afficher la correction détaillée
3 0011
+
D 1101
+
5 0101
Résultat : 3D5₁₆ = 0011 1101 0101₂
Les zéros situés au début de chaque groupe de quatre bits doivent être conservés pendant la conversion.
3

Conversion avec visualisation des bits

Lire graphiquement les bits à 0 et les bits à 1.

Consigne : convertir 9F et représenter les huit bits obtenus.
Afficher la correction et le schéma
9 1001
+
F 1111
1
0
0
1
1
1
1
1
2⁷ 2⁶ 2⁵ 2⁴ 2⁰
Résultat : 9F₁₆ = 1001 1111₂

Niveau 2 — Traiter les cas particuliers

4

Nombre comportant des zéros initiaux

Préserver la longueur et la représentation complète.

Consigne : convertir 00AF en conservant tous les groupes.
Afficher la correction détaillée
0 0000
+
0 0000
+
A 1010
+
F 1111
Résultat complet sur 16 bits : 00AF₁₆ = 0000 0000 1010 1111₂
La valeur numérique reste identique sans les zéros initiaux, mais leur conservation permet de respecter une représentation sur 16 bits.
5

Détection d’une entrée invalide

Vérifier les caractères avant de lancer la conversion.

Consigne : analyser puis convertir l’entrée 2G7.
Afficher l’analyse de l’erreur
  1. 2 appartient à l’ensemble hexadécimal.
  2. G ne fait pas partie des caractères 0–9 et A–F.
  3. La conversion doit être interrompue avant de produire un résultat partiel trompeur.
Entrée invalide : le caractère G n’est pas un chiffre hexadécimal.
Décision du programme : Conversion refusée
6

Comptage des bits à 1

Associer conversion binaire et analyse du résultat.

Consigne : convertir 2F3, puis compter le nombre de bits égaux à 1.
Afficher la correction détaillée
2 0010
+
F 1111
+
3 0011
  • 0010 contient 1 bit à 1.
  • 1111 contient 4 bits à 1.
  • 0011 contient 2 bits à 1.
  • Total : 1 + 4 + 2 = 7.
Résultat : 2F3₁₆ = 0010 1111 0011₂

Nombre de bits à 1 : 7

Niveau 3 — Programmer la conversion en langage C

7

Programme C avec table de correspondance

Convertir une chaîne hexadécimale après validation.

Consigne : écrire une fonction C qui accepte les lettres majuscules et minuscules et signale tout caractère invalide.
Afficher le programme corrigé
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int convertirHexVersBinaire(const char *hex)
{
    const char *table[16] = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111"
    };

    size_t i;

    if (hex == NULL || hex[0] == '\0') {
        printf("Erreur : entree vide.\n");
        return 0;
    }

    /* Première étape : validation complète */
    for (i = 0; hex[i] != '\0'; i++) {
        if (!isxdigit((unsigned char)hex[i])) {
            printf(
                "Erreur : caractere invalide '%c' a la position %zu.\n",
                hex[i],
                i + 1
            );
            return 0;
        }
    }

    /* Deuxième étape : conversion */
    printf("Binaire : ");

    for (i = 0; hex[i] != '\0'; i++) {
        unsigned char caractere =
            (unsigned char)toupper((unsigned char)hex[i]);

        int valeur;

        if (caractere >= '0' && caractere <= '9') {
            valeur = caractere - '0';
        } else {
            valeur = caractere - 'A' + 10;
        }

        printf("%s", table[valeur]);

        if (hex[i + 1] != '\0') {
            printf(" ");
        }
    }

    printf("\n");
    return 1;
}

int main(void)
{
    char nombreHex[101];

    printf("Entrez un nombre hexadecimal : ");

    if (scanf("%100s", nombreHex) != 1) {
        printf("Erreur de lecture.\n");
        return 1;
    }

    convertirHexVersBinaire(nombreHex);

    return 0;
}
Le programme valide toute la chaîne avant l’affichage. Il évite ainsi de produire une conversion partielle en présence d’un caractère incorrect.
Entrée : aF3 Sortie : 1010 1111 0011
8

Programme C avec comptage des bits

Calculer simultanément le résultat binaire et le nombre de 1.

Consigne : compléter le programme afin de compter les bits à 1 pendant la conversion.
Afficher le programme corrigé
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    const char *table[16] = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111"
    };

    char hex[101];
    int totalBitsUn = 0;
    int i;

    printf("Nombre hexadecimal : ");

    if (scanf("%100s", hex) != 1) {
        printf("Erreur de lecture.\n");
        return 1;
    }

    /* Validation */
    for (i = 0; hex[i] != '\0'; i++) {
        if (!isxdigit((unsigned char)hex[i])) {
            printf("Caractere invalide : %c\n", hex[i]);
            return 1;
        }
    }

    printf("Binaire : ");

    for (i = 0; hex[i] != '\0'; i++) {
        int valeur;
        int j;
        unsigned char c =
            (unsigned char)toupper((unsigned char)hex[i]);

        if (c >= '0' && c <= '9') {
            valeur = c - '0';
        } else {
            valeur = c - 'A' + 10;
        }

        printf("%s ", table[valeur]);

        for (j = 0; j < 4; j++) {
            if (table[valeur][j] == '1') {
                totalBitsUn++;
            }
        }
    }

    printf("\nNombre de bits a 1 : %d\n", totalBitsUn);

    return 0;
}
Entrée : 2F3 Résultat binaire : 0010 1111 0011 Nombre de bits à 1 : 7

Niveau 4 — Réaliser des opérations bit à bit

9

Opération AND entre deux valeurs

Comparer les bits de deux nombres hexadécimaux.

Consigne : effectuer l’opération logique A3 AND 5F.
Afficher la correction schématisée
  • A3 devient 1010 0011.
  • 5F devient 0101 1111.
  • Le résultat vaut 1 uniquement lorsque les deux bits comparés valent 1.
A3 = 1010 0011 5F = 0101 1111 ——— AND 0000 0011
Résultat : A3 AND 5F = 0000 0011₂ = 03₁₆
10

Décalage logique vers la gauche

Observer l’effet d’un déplacement de deux positions.

Consigne : convertir 3A, puis effectuer un décalage à gauche de deux bits sur une représentation de huit bits.
Afficher la correction détaillée
Valeur initiale : 0011 1010 Décalage << 2 : 1110 1000
  1. Les deux bits situés à gauche sortent de la représentation sur huit bits.
  2. Deux zéros sont ajoutés à droite.
  3. 1110 1000 correspond à E8 en hexadécimal.
Résultat sur 8 bits : 3A << 2 = 1110 1000₂ = E8₁₆
Sur un type entier plus large, la valeur mathématique complète de 0x3A << 2 est 0xE8, soit 232 en décimal.

Défi de synthèse

Écrire un programme qui lit deux nombres hexadécimaux, vérifie leur validité, les affiche en binaire et calcule les opérations AND, OR et XOR.

Données : A = 6D = 0110 1101 B = 3A = 0011 1010Résultats attendus : AND = 0010 1000 OR = 0111 1111 XOR = 0101 0111
Afficher la vérification du défi
OpérationRésultat binaireRésultat hexadécimal
6D AND 3A0010 100028
6D OR 3A0111 11117F
6D XOR 3A0101 011157

Références

Pour plus de lecture sur la conversion des systèmes de numération et la programmation en C, consultez les ressources suivantes :

  1. Guide de programmation en C
  2. Documentation sur les systèmes de numération

Exercices Avancés de Conversion Hexadécimale en Binaire en Langage C

Voici une série d’exercices avancés pour vous aider à maîtriser la conversion de nombres hexadécimaux en binaire en utilisant le langage de programmation C. Ces exercices comprennent des conversions directes, des manipulations de chaînes de caractères, et des cas particuliers qui vous permettront de consolider vos compétences.

Exercice 1 : Conversion de Longs Nombres Hexadécimaux

Question : Écrire un programme en C qui convertit un long nombre hexadécimal en binaire et affiche le résultat. Par exemple, convertir 1A3F4C2B en binaire.

Solution Attendue :

// Long hexadécimal : 1A3F4C2B
// Binaire attendu : 0001 1010 0011 1111 0100 1100 0010 1011

Exercice 2 : Conversion avec Validation

Question : Écrire un programme en C qui convertit un nombre hexadécimal en binaire. Le programme doit valider que l’entrée est bien un nombre hexadécimal valide (comprenant seulement les caractères 0-9, A-F, a-f) avant de faire la conversion.

Solution Attendue :

// Entrée : G45
// Sortie : Erreur, caractère invalide G

Exercice 3 : Conversion et Comptage de Bits

Question : Écrire un programme en C qui convertit un nombre hexadécimal en binaire et compte le nombre total de bits à 1 dans le résultat binaire.

Solution Attendue :

// Hexadécimal : 2F3
// Binaire : 0010 1111 0011
// Nombre de bits à 1 : 7

Exercice 4 : Conversion de Séquences Hexadécimales

Question : Écrire un programme en C qui lit une série de nombres hexadécimaux séparés par des virgules, les convertit en binaire, et affiche chaque conversion.

Solution Attendue :

// Entrée : 1A3,4F2,B3
// Sortie : 
// 1A3 -> 0001 1010 0011
// 4F2 -> 0100 1111 0010
// B3 -> 1011 0011

Exercice 5 : Conversion et Représentation Visuelle

Question : Écrire un programme en C qui convertit un nombre hexadécimal en binaire et affiche le résultat sous forme d’un tableau de bits. Utilisez des * pour représenter les bits à 1 et des . pour les bits à 0.

Solution Attendue :

// Hexadécimal : 9F
// Binaire : 1001 1111
// Tableau : 
// * . . .
// * * * *
// * . . .
Exercice 6 : Conversion et Opérations Bit à Bit

Question : Écrire un programme en C qui convertit deux nombres hexadécimaux en binaire, effectue une opération ET logique bit à bit entre les deux résultats binaires, et affiche le résultat de cette opération en binaire.

Solution Attendue :

// Hexadécimal 1 : A3 (1010 0011)
// Hexadécimal 2 : 5F (0101 1111)
// Résultat AND : 0000 0011

Exercice 7 : Conversion Inverse et Vérification

Question : Écrire un programme en C qui convertit un nombre hexadécimal en binaire, puis reconvertit ce nombre binaire en hexadécimal pour vérifier l’exactitude de la conversion initiale.

Solution Attendue :

// Hexadécimal : 4C
// Binaire : 0100 1100
// Hexadécimal reconverti : 4C
// Vérification : Réussi

Exercice 8 : Conversion et Opérations de Décalage

Question : Écrire un programme en C qui convertit un nombre hexadécimal en binaire, effectue un décalage logique vers la gauche de deux bits sur le résultat binaire, et affiche le nouveau résultat en binaire.

Solution Attendue :

// Hexadécimal : 3A (0011 1010)
// Binaire décalé : 1110 1000

Cas Particuliers et Questions Piège de Conversion Hexadécimale en Binaire en Langage C

La conversion de nombres hexadécimaux en binaire peut sembler directe, mais il existe des cas particuliers et des pièges courants qui peuvent compliquer la tâche. Voici une série de cas particuliers et de questions piège pour tester et renforcer votre compréhension.

Cas Particuliers

Nombres Hexadécimaux avec des Zéros Initiaux

  • Question : Convertir 004F en binaire.
  • Solution Attendue : 004F en hexadécimal est 0000 0000 0100 1111 en binaire.

Lettres Minuscules dans les Nombres Hexadécimaux

  • Question : Convertir aBcD en binaire.
  • Solution Attendue : aBcD en hexadécimal est 1010 1011 1100 1101 en binaire.

Nombres Hexadécimaux Composés Uniquement de Lettres

  • Question : Convertir ABCD en binaire.
  • Solution Attendue : ABCD en hexadécimal est 1010 1011 1100 1101 en binaire.

Nombres Hexadécimaux Très Longs

  • Question : Convertir 123456789ABCDEF en binaire.
  • Solution Attendue : 123456789ABCDEF en hexadécimal est 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 en binaire.
Questions Piège

Validation des Entrées Hexadécimales

  • Question : Convertir G4H2 en binaire.
  • Piège : G et H ne sont pas des caractères hexadécimaux valides.
  • Solution Attendue : Le programme doit afficher une erreur pour les caractères invalides.

Combinaison de Zéros et de Lettres

  • Question : Convertir 00AB en binaire.
  • Piège : Ne pas ignorer les zéros initiaux.
  • Solution Attendue : 00AB en hexadécimal est 0000 0000 1010 1011 en binaire.

Nombres Hexadécimaux avec des Espaces

  • Question : Convertir 1 2 3 en binaire.
  • Piège : Les espaces doivent être ignorés ou considérés comme des séparateurs incorrects.
  • Solution Attendue : Le programme doit afficher une erreur ou supprimer les espaces avant la conversion.

Caractères Mixtes et Non-Hexadécimaux

  • Question : Convertir 12G3H4 en binaire.
  • Piège : Mélange de caractères hexadécimaux et non-hexadécimaux.
  • Solution Attendue : Le programme doit afficher une erreur pour les caractères G et H.

Conversion de Chaînes Vidées

  • Question : Convertir une chaîne vide en binaire.
  • Piège : Gérer les entrées vides.
  • Solution Attendue : Le programme doit afficher une erreur ou un message indiquant que l’entrée est vide.

Nombres Hexadécimaux avec des Caractères Spéciaux

  • Question : Convertir 1A#C en binaire.
  • Piège : Les caractères spéciaux comme # ne sont pas valides.
  • Solution Attendue : Le programme doit afficher une erreur pour le caractère #.

Conversion de Nombres Négatifs (Invalide en Hexadécimal)

  • Question : Convertir -2A3 en binaire.
  • Piège : Les nombres négatifs ne sont pas valides en notation hexadécimale classique.
  • Solution Attendue : Le programme doit afficher une erreur pour le signe -.
Programme de Démonstration en C pour Gérer les Cas Particuliers

Voici un programme en C qui prend en compte certains de ces cas particuliers et pièges.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void hexToBinary(char hex[]) {
    int i = 0;
    printf("Binaire: ");
    while (hex[i]) {
        if (!isxdigit(hex[i])) {
            printf("\nErreur: Caractère hexadécimal invalide %c\n", hex[i]);
            return;
        }
        switch (toupper(hex[i])) {
            case '0': printf("0000 "); break;
            case '1': printf("0001 "); break;
            case '2': printf("0010 "); break;
            case '3': printf("0011 "); break;
            case '4': printf("0100 "); break;
            case '5': printf("0101 "); break;
            case '6': printf("0110 "); break;
            case '7': printf("0111 "); break;
            case '8': printf("1000 "); break;
            case '9': printf("1001 "); break;
            case 'A': printf("1010 "); break;
            case 'B': printf("1011 "); break;
            case 'C': printf("1100 "); break;
            case 'D': printf("1101 "); break;
            case 'E': printf("1110 "); break;
            case 'F': printf("1111 "); break;
        }
        i++;
    }
    printf("\n");
}

int main() {
    char hex[100];
    printf("Entrer un nombre hexadécimal: ");
    scanf("%s", hex);
    hexToBinary(hex);
    return 0;
}

Ce programme vérifie chaque caractère pour s’assurer qu’il est bien un caractère hexadécimal valide avant de procéder à la conversion. Il affiche un message d’erreur si un caractère invalide est détecté.

En pratiquant ces cas particuliers et en prenant en compte les pièges potentiels, vous serez mieux préparé à gérer les complexités de la conversion des nombres hexadécimaux en binaire en langage C.

error: Content is protected !!