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 son0。

  • Inicialización desde un entero: convierte el entero a binario.

  • Inicialización desde una cadena: analiza la cadena como binario.

Ejemplo

std::bitset<8> bits1;               // Inicialización por defecto: 00000000
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

std::bitset<8> bits("00001111");
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::bitset<8> bits("10101010");
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

std::bitset<8> bits("10101010");
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> bits1("10101010");
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 <iostream>
#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 <iostream>
#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 <iostream>
#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 excedeunsigned 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>。

otras extensiones.