Algorithmes C/C++

La manipulation de bits en C et C++

Dans cette leçon, vous allez activer, désactiver, inverser et tester des bits d'un entier pour stocker plusieurs états marche/arrêt.

Introduction

Chaque bit d'un entier peut stocker une valeur vraie ou fausse. Un seul entier non signé peut donc contenir plusieurs options marche/arrêt indépendantes, appelées drapeaux (flags). Cette technique des masques de bits (bit mask) est très répandue en programmation système et en informatique embarquée.

Points importants

  • Testez avec une entrée vide, un seul élément, des doublons et des données déjà triées.
  • Rendez d'abord le code correct, optimisez ensuite.
  • Dans du vrai code, préférez les fonctions toutes prêtes de la bibliothèque standard.

Exemples de code C et C++

C
Exécuter →
main.c
#include <stdio.h>

int main(void) {
    unsigned flags = 0;
    flags |= 1u << 1;
    flags |= 1u << 3;
    flags ^= 1u << 1;
    printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
Résultat de l’exécution
flags=8 bit3=1
C++
Exécuter →
main.cpp
#include <bitset>
#include <iostream>

int main() {
    std::bitset<4> flags;
    flags.set(1);
    flags.set(3);
    flags.flip(1);
    std::cout << "flags=" << flags
              << " bit3=" << flags.test(3) << '\n';
}
Résultat de l’exécution
flags=1000 bit3=1

Comparaison entre C et C++

L'expression 1u << n crée un nombre dont seul le bit n vaut 1. L'opérateur |= active un bit, ^= l'inverse, et (flags >> 3) & 1u teste le bit 3. Après avoir activé les bits 1 et 3 puis inversé à nouveau le bit 1, seul le bit 3 reste activé, flags vaut donc 8. Préférez les types non signés (unsigned) pour que les décalages de bits donnent des résultats prévisibles. En C++, std::bitset propose des méthodes explicites comme set() et flip() et affiche la valeur en binaire.

C

Les boucles, les pointeurs, les longueurs et les tampons temporaires sont écrits explicitement.

C++

Les itérateurs et les algorithmes standard séparent le traitement de la façon dont les données sont stockées.

Exercices d'approfondissement

Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.

  • Déroulez chaque comparaison sur papier.
  • Testez avec des doublons et des valeurs très grandes et très petites.
  • Mesurez le temps d'exécution de votre code et comparez-le à la bibliothèque standard.

S'entraîner avec un défi

Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.

Tous les défis