Стандартная библиотека C++<bitset>

В программировании на C++,<bitset>Он является частью стандартной библиотеки и предоставляет способ манипулирования битовыми наборами фиксированного размера.

Битовый набор — это массив, состоящий из битов, где каждый бит может быть 0 или 1.

<bitset>Он обеспечивает эффективный способ хранения и манипулирования двоичными данными, особенно подходит для сценариев, требующих операций на уровне битов, таких как управление флагами, операции с битовыми масками и т. д.

bitsetЭто шаблонный класс, параметр шаблона которого определяет размер битового набора. Например,bitset<32>он представляет набор битов, содержащий 32 бита.

Синтаксис

Далее используетсяbitsetБазовый синтаксис:

#include <bitset>

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

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

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

Базовое использование std::bitset

std::bitset — это шаблонный класс, используемый для представления битовой последовательности фиксированного размера. Его параметр шаблона — количество битов (N), которое указывает длину двоичной последовательности.

Определение std::bitset:

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

Инициализация std::bitset:

  • Инициализация по умолчанию: все биты равны0。

  • Инициализация из целого числа: преобразует целое число в двоичное представление.

  • Инициализация из строки: разбирает строку как двоичную.

Пример

std::bitset<8> bits1;               // Инициализация по умолчанию: 00000000
std::bitset<8> bits2(42);           // Инициализация из целого числа: 00101010
std::bitset<8> bits3("10101010");   // Инициализация из строки: 10101010

Общие функции-члены

std::bitset предоставляет богатый набор функций-членов для манипулирования двоичными битами.

Доступ и изменение битов:

  • operator[]: Доступ к конкретному биту или его изменение.

  • set(): Установить конкретный бит или все биты в1。

  • reset(): Установить конкретный бит или все биты в0。

  • flip(): Инвертировать конкретный бит или все биты.

Пример

std::bitset<8> bits("00001111");
bits[0] = 1;          // Изменить бит 0: 00001111 -> 00001111
bits.set(4);          // Установить бит 4: 00011111 -> 00011111
bits.reset(1);        // Сбросить бит 1: 00011111 -> 00011101
bits.flip();          // Инвертировать все биты: 00011101 -> 11100010

Запрос информации о битах:

  • count(): возвращает1количество.

  • size(): возвращает количество битов.

  • test(pos): Проверяет, установлен ли конкретный бит1。

  • all(): Проверяет, установлены ли все биты1。

  • any(): Проверяет, установлен ли хотя бы один бит1。

  • none(): Проверяет, установлены ли все биты0。

Пример

std::bitset<8> bits("10101010");
std::cout << "Количество единиц: " << bits.count() << std::endl;  // Вывод 4
std::cout << "Размер: " << bits.size() << std::endl;          // Вывод 8
std::cout << "Установлен ли бит 3? " << bits.test(3) << std::endl; // Вывод 1 (true)
std::cout << "Все биты установлены? " << bits.all() << std::endl;   // Вывод 0 (false)

Преобразование в другие типы:

  • to_ulong(): соответствуетstd::bitsetПреобразовано вunsigned long。

  • to_ullong(): соответствуетstd::bitsetПреобразовано вunsigned long long。

  • to_string(): соответствуетstd::bitsetПреобразовать в строку.

Пример

std::bitset<8> bits("10101010");
unsigned long num = bits.to_ulong();  // Преобразовать в целое: 170
std::string str = bits.to_string();   // Преобразовать в строку: "10101010"

Побитовые операции

std::bitset поддерживает распространённые побитовые операции, такие как побитовое И, побитовое ИЛИ, побитовое исключающее ИЛИ и побитовое НЕ.

  • &: побитовое И

  • |: побитовое ИЛИ

  • ^: побитовое исключающее ИЛИ

  • ~: побитовое НЕ

Пример

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

std::bitset<8> result_and = bits1 & bits2;  // Побитовое И: 10100000
std::bitset<8> result_or = bits1 | bits2;   // Побитовое ИЛИ: 11111010
std::bitset<8> result_xor = bits1 ^ bits2;  // Побитовое исключающее ИЛИ: 01011010
std::bitset<8> result_not = ~bits1;         // Побитовое НЕ: 01010101

Пример

Базовое использование:

Пример

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("11001010"); // Инициализация из строки
    std::cout << "Исходный bitset: " << b << std::endl;

    // Доступ к биту в определённой позиции
    std::cout << "Бит в позиции 3: " << b[3] << std::endl;

    // Изменить бит
    b[3] = 1;
    std::cout << "Изменённый bitset: " << b << std::endl;

    // Переключить бит
    b.flip();
    std::cout << "Переключённый bitset: " << b << std::endl;

    return 0;
}

Результат вывода:

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

Побитовые операции:

Пример

#include <iostream>
#include <bitset>

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

    // Побитовая операция И
    std::bitset<8> b_and = b1 & b2;
    std::cout << "Побитовое И: " << b_and << std::endl;

    // Побитовая операция ИЛИ
    std::bitset<8> b_or = b1 | b2;
    std::cout << "Побитовое ИЛИ: " << b_or << std::endl;

    // Побитовая операция исключающего ИЛИ
    std::bitset<8> b_xor = b1 ^ b2;
    std::cout << "Побитовое исключающее ИЛИ: " << b_xor << std::endl;

    // Побитовая операция НЕ
    std::bitset<8> b_not = ~b1;
    std::cout << "Побитовое НЕ: " << b_not << std::endl;

    return 0;
}

Результат вывода:

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

Итерация по битам bitset:

Пример

#include <iostream>
#include <bitset>

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

    // Итерация по битам в bitset
    for (size_t i = 0; i < b.size(); ++i) {
        std::cout << b[i];
    }
    std::cout << std::endl;

    return 0;
}

Результат вывода:

10101010

bitsetявляется очень полезным инструментом в стандартной библиотеке C++, позволяющим программистам обрабатывать данные на битовом уровне интуитивно и эффективно. На приведённых выше примерах мы видим, как объявлять, инициализировать, получать доступ, изменять и выполнять битовые операции. Эти возможности очень полезны при работе с двоичными данными или в ситуациях, требующих контроля на битовом уровне.

Примечания

  • std::bitsetЕго размер фиксирован и определяется во время компиляции.

  • Если количество битов превышаетunsigned longилиunsigned long longколичество битов,to_ulong()иto_ullong()выброситstd::overflow_errorисключение.

  • std::bitsetОн не поддерживает динамическое изменение размера; если нужен динамический битовый набор, рассмотритеstd::vector<bool>。

Другие расширения