Bibliothèque standard C++<bitset>

En programmation C++,<bitset>Il fait partie de la bibliothèque standard et fournit un moyen de manipuler des ensembles de bits de taille fixe.

Un ensemble de bits est un tableau composé de bits, où chaque bit peut valoir 0 ou 1.

<bitset>Il fournit un moyen efficace de stocker et de manipuler des données binaires, particulièrement adapté aux scénarios nécessitant des opérations au niveau des bits, telles que la gestion de drapeaux, les opérations de masque de bits, etc.

bitsetIl s'agit d'une classe modèle dont le paramètre de modèle définit la taille de l'ensemble de bits. Par exemple,bitset<32>il représente un ensemble de bits contenant 32 bits.

Syntaxe

Ce qui suit utilisebitsetSyntaxe de base :

#include <bitset>

// 声明一个大小为N的bitset
std::bitset<N> b;

// 初始化bitset
b = std::bitset<N>(value);

// 访问位集合中的单个位
bool bit = b[i];

Utilisation de base de std::bitset

std::bitset est une classe modèle utilisée pour représenter une séquence de taille fixe de bits binaires. Son paramètre de modèle est le nombre de bits (N), qui indique la longueur de la séquence binaire.

Définir std::bitset :

std::bitset<8> bits;  // 定义一个 8 位的二进制序列

Initialiser std::bitset :

  • Initialisation par défaut : tous les bits sont0。

  • Initialisation à partir d'un entier : convertit l'entier en binaire.

  • Initialisation à partir d'une chaîne : analyse la chaîne comme du binaire.

Exemple

std::bitset<8> bits1;               // Initialisation par défaut : 00000000
std::bitset<8> bits2(42);           // Initialiser à partir d'un entier : 00101010
std::bitset<8> bits3("10101010");   // Initialiser à partir de la chaîne : 10101010

Fonctions membres courantes

std::bitset fournit de riches fonctions membres pour manipuler des bits binaires.

Accès et modification des bits :

  • operator[]: Accéder à un bit spécifique ou le modifier.

  • set(): Définir un bit spécifique ou tous les bits à1。

  • reset(): Définir un bit spécifique ou tous les bits à0。

  • flip(): Inverser un bit spécifique ou tous les bits.

Exemple

std::bitset<8> bits("00001111");
bits[0] = 1;          // Modifier le bit 0 : 00001111 -> 00001111
bits.set(4);          // Définir le bit 4 : 00011111 -> 00011111
bits.reset(1);        // Réinitialiser le bit 1 : 00011111 -> 00011101
bits.flip();          // Inverser tous les bits : 00011101 -> 11100010

Interrogation des informations sur les bits :

  • count(): renvoie1le nombre de.

  • size(): renvoie le nombre de bits.

  • test(pos): Vérifie si un bit spécifique est1。

  • all(): Vérifie si tous les bits sont1。

  • any(): Vérifie si un bit quelconque est1。

  • none(): Vérifie si tous les bits sont0。

Exemple

std::bitset<8> bits("10101010");
std::cout << "Nombre de 1 : " << bits.count() << std::endl;  // Sortie 4
std::cout << "Taille : " << bits.size() << std::endl;          // Sortie 8
std::cout << "Le bit 3 est-il défini ? " << bits.test(3) << std::endl; // Sortie 1 (vrai)
std::cout << "Tous les bits sont-ils définis ? " << bits.all() << std::endl;   // Sortie 0 (faux)

Convertir vers d'autres types :

  • to_ulong(): correspond àstd::bitsetConverti enunsigned long。

  • to_ullong(): correspond àstd::bitsetConverti enunsigned long long。

  • to_string(): correspond àstd::bitsetConvertir en chaîne.

Exemple

std::bitset<8> bits("10101010");
unsigned long num = bits.to_ulong();  // Convertir en entier : 170
std::string str = bits.to_string();   // Convertir en chaîne : "10101010"

Opérations bit à bit

std::bitset prend en charge les opérations bit à bit courantes, telles que le ET bit à bit, le OU bit à bit, le OU exclusif bit à bit et le NON bit à bit.

  • &: ET bit à bit

  • |: OU bit à bit

  • ^: OU exclusif bit à bit

  • ~: NON bit à bit

Exemple

std::bitset<8> bits1("10101010");
std::bitset<8> bits2("11110000");

std::bitset<8> result_and = bits1 & bits2;  // ET bit à bit : 10100000
std::bitset<8> result_or = bits1 | bits2;   // OU bit à bit : 11111010
std::bitset<8> result_xor = bits1 ^ bits2;  // OU exclusif bit à bit : 01011010
std::bitset<8> result_not = ~bits1;         // NON bit à bit : 01010101

Exemple

Utilisation de base :

Exemple

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("11001010"); // Initialiser à partir d'une chaîne
    std::cout << "Bitset initial : " << b << std::endl;

    // Accéder à un bit à une position spécifique
    std::cout << "Bit à la position 3 : " << b[3] << std::endl;

    // Modifier un bit
    b[3] = 1;
    std::cout << "Bitset modifié : " << b << std::endl;

    // Inverser un bit
    b.flip();
    std::cout << "Bitset inversé : " << b << std::endl;

    return 0;
}

Résultat de sortie :

Initial bitset: 11001010
Bit at position 3: 0
Modified bitset: 11001011
Flipped bitset: 00110110

Opérations bit à bit :

Exemple

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b1("10101010");
    std::bitset<8> b2("11110000");

    // Opération ET bit à bit
    std::bitset<8> b_and = b1 & b2;
    std::cout << "ET bit à bit : " << b_and << std::endl;

    // Opération OU bit à bit
    std::bitset<8> b_or = b1 | b2;
    std::cout << "OU bit à bit : " << b_or << std::endl;

    // Opération OU exclusif bit à bit
    std::bitset<8> b_xor = b1 ^ b2;
    std::cout << "OU exclusif bit à bit : " << b_xor << std::endl;

    // Opération NON bit à bit
    std::bitset<8> b_not = ~b1;
    std::cout << "NON bit à bit : " << b_not << std::endl;

    return 0;
}

Résultat de sortie :

Bitwise AND: 10100000
Bitwise OR: 11111010
Bitwise XOR: 01111010
Bitwise NOT: 01010101

Parcourir le bitset :

Exemple

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("10101010");

    // Parcourir les bits du bitset
    for (size_t i = 0; i < b.size(); ++i) {
        std::cout << b[i];
    }
    std::cout << std::endl;

    return 0;
}

Résultat de sortie :

10101010

bitsetest un outil très utile de la bibliothèque standard C++, permettant aux programmeurs de manipuler des données au niveau des bits de manière intuitive et efficace. À travers les exemples ci-dessus, nous pouvons voir comment déclarer, initialiser, accéder, modifier et effectuer des opérations bit à bit. Ces fonctionnalités sont très utiles lorsqu'on traite des données binaires ou des situations nécessitant un contrôle au niveau des bits.

Notes

  • std::bitsetSa taille est fixe et déterminée à la compilation.

  • Si le nombre de bits dépasseunsigned longouunsigned long longle nombre de bits,to_ulong()etto_ullong()lèverastd::overflow_errorune exception.

  • std::bitsetIl ne prend pas en charge le redimensionnement dynamique ; si un ensemble de bits dynamique est nécessaire, envisagezstd::vector<bool>。

autres extensions