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 sont
0。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> 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
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::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
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> 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 <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 <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 <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épasse
unsigned 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>。