Стандартная библиотека 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> bits2(42); // Инициализация из целого числа: 00101010
std::bitset<8> bits3("10101010"); // Инициализация из строки: 10101010
Общие функции-члены
std::bitset предоставляет богатый набор функций-членов для манипулирования двоичными битами.
Доступ и изменение битов:
operator[]: Доступ к конкретному биту или его изменение.set(): Установить конкретный бит или все биты в1。reset(): Установить конкретный бит или все биты в0。flip(): Инвертировать конкретный бит или все биты.
Пример
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::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Преобразовать в строку.
Пример
unsigned long num = bits.to_ulong(); // Преобразовать в целое: 170
std::string str = bits.to_string(); // Преобразовать в строку: "10101010"
Побитовые операции
std::bitset поддерживает распространённые побитовые операции, такие как побитовое И, побитовое ИЛИ, побитовое исключающее ИЛИ и побитовое НЕ.
&: побитовое И|: побитовое ИЛИ^: побитовое исключающее ИЛИ~: побитовое НЕ
Пример
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 <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 <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 <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>。