Biblioteca estándar de C++<bitset>
En la programación en C++,<bitset>es parte de la biblioteca estándar, y proporciona una manera de operar con conjuntos de bits de tamaño fijo.
Un conjunto de bits es un arreglo de bits, donde cada bit puede ser 0 o 1.
<bitset>Proporciona una forma eficiente de almacenar y operar datos binarios, especialmente adecuada para escenarios que requieren operaciones a nivel de bits, como la gestión de banderas y operaciones de máscara de bits.
bitsetEs una clase de plantilla cuyo parámetro de plantilla define el tamaño del conjunto de bits. Por ejemplo,bitset<32>representa un conjunto de bits que contiene 32 bits.
Sintaxis
A continuación se muestra el uso debitsetla sintaxis básica:
#include <bitset> // 声明一个大小为N的bitset std::bitset<N> b; // 初始化bitset b = std::bitset<N>(value); // 访问位集合中的单个位 bool bit = b[i];
Uso básico de std::bitset
std::bitset es una clase de plantilla que se utiliza para representar secuencias de bits binarios de tamaño fijo. Su parámetro de plantilla es el número de bits (N), que indica la longitud de la secuencia binaria.
Definir std::bitset:
std::bitset<8> bits; // 定义一个 8 位的二进制序列
Inicializar std::bitset:
Inicialización por defecto: todos los bits son
0。Inicialización desde un entero: convierte el entero a binario.
Inicialización desde una cadena: analiza la cadena como binario.
Ejemplo
std::bitset<8> bits2(42); // Inicialización desde un entero: 00101010
std::bitset<8> bits3("10101010"); // Inicialización desde una cadena: 10101010
Funciones miembro comunes
std::bitset proporciona una gran variedad de funciones miembro para manipular bits binarios.
Acceder y modificar bits:
operator[]: accede o modifica un bit determinado.set(): establece un bit o todos los bits en1。reset(): establece un bit o todos los bits en0。flip(): invierte un bit o todos los bits.
Ejemplo
bits[0] = 1; // Modificar el bit 0: 00001111 -> 00001111
bits.set(4); // Establecer el bit 4: 00001111 -> 00011111
bits.reset(1); // Poner a 0 el bit 1: 00011111 -> 00011101
bits.flip(); // Invertir todos los bits: 00011101 -> 11100010
Consultar información de bits:
count(): devuelve1el número.size(): devuelve el número de bits.test(pos): comprueba si un bit es1。all(): comprueba si todos los bits son1。any(): comprueba si algún bit es1。none(): comprueba si todos los bits son0。
Ejemplo
std::cout << "Count of 1s: " << bits.count() << std::endl; // Salida 4
std::cout << "Size: " << bits.size() << std::endl; // Salida 8
std::cout << "Is bit 3 set? " << bits.test(3) << std::endl; // Salida 1 (true)
std::cout << "All bits set? " << bits.all() << std::endl; // Salida 0 (false)
Conversión a otros tipos:
to_ulong(): conviertestd::bitsetaunsigned long。to_ullong(): conviertestd::bitsetaunsigned long long。to_string(): conviertestd::bitseta cadena.
Ejemplo
unsigned long num = bits.to_ulong(); // Convertir a entero: 170
std::string str = bits.to_string(); // Convertir a cadena: "10101010"
Operaciones de bits
std::bitset admite operaciones de bits comunes, como AND bit a bit, OR bit a bit, XOR bit a bit y NOT bit a bit.
&: AND bit a bit|: OR bit a bit^: XOR bit a bit~: NOT bit a bit
Ejemplo
std::bitset<8> bits2("11110000");
std::bitset<8> result_and = bits1 & bits2; // AND bit a bit: 10100000
std::bitset<8> result_or = bits1 | bits2; // OR bit a bit: 11111010
std::bitset<8> result_xor = bits1 ^ bits2; // XOR bit a bit: 01011010
std::bitset<8> result_not = ~bits1; // NOT bit a bit: 01010101
Ejemplo
Uso básico:
Ejemplo
#include <bitset>
int main() {
std::bitset<8> b("11001010"); // Inicializar desde una cadena
std::cout << "Initial bitset: " << b << std::endl;
// Acceder al bit en una posición específica
std::cout << "Bit at position 3: " << b[3] << std::endl;
// Modificar un bit
b[3] = 1;
std::cout << "Modified bitset: " << b << std::endl;
// Invertir un bit
b.flip();
std::cout << "Flipped bitset: " << b << std::endl;
return 0;
}
Resultado:
Initial bitset: 11001010 Bit at position 3: 0 Modified bitset: 11001011 Flipped bitset: 00110110
Operaciones de bits:
Ejemplo
#include <bitset>
int main() {
std::bitset<8> b1("10101010");
std::bitset<8> b2("11110000");
// Operación AND de bits
std::bitset<8> b_and = b1 & b2;
std::cout << "Bitwise AND: " << b_and << std::endl;
// Operación OR de bits
std::bitset<8> b_or = b1 | b2;
std::cout << "Bitwise OR: " << b_or << std::endl;
// Operación XOR de bits
std::bitset<8> b_xor = b1 ^ b2;
std::cout << "Bitwise XOR: " << b_xor << std::endl;
// Operación NOT de bits
std::bitset<8> b_not = ~b1;
std::cout << "Bitwise NOT: " << b_not << std::endl;
return 0;
}
Resultado:
Bitwise AND: 10100000 Bitwise OR: 11111010 Bitwise XOR: 01111010 Bitwise NOT: 01010101
Recorrer el conjunto de bits en bucle:
Ejemplo
#include <bitset>
int main() {
std::bitset<8> b("10101010");
// Recorrer en bucle los bits del bitset
for (size_t i = 0; i < b.size(); ++i) {
std::cout << b[i];
}
std::cout << std::endl;
return 0;
}
Resultado:
10101010
bitsetEs una herramienta muy útil en la biblioteca estándar de C++ que permite a los programadores manejar datos a nivel de bits de forma intuitiva y eficiente. A través de los ejemplos anteriores, podemos ver cómo declarar, inicializar, acceder, modificar y realizar operaciones de bits. Estas funciones son muy útiles en situaciones que requieren el procesamiento de datos binarios o control a nivel de bits.
Precauciones
std::bitsetEl tamaño es fijo y se determina en tiempo de compilación.Si el número de bits excede
unsigned longounsigned long longel número de bits de,to_ulong()yto_ullong()se lanzarástd::overflow_erroruna excepción.std::bitsetNo admite el ajuste dinámico de tamaño; si necesita un conjunto de bits dinámico, puede considerarstd::vector<bool>。