--- title: "bitset" created: 2025-11-28 tags: - 算法 --- # bitset `bitset`是C++标准库中的一个非常有用的模板类,它提供了一种方便的方式来存储和操作固定大小的位序列。使用`bitset`,你可以执行位操作,如位的设置、复位、翻转,以及查询特定位的状态等,而不需要直接操作位运算符。这使得代码更加简洁、易读。 ### 基本用法 要使用`bitset`,你需要包含头文件``。创建一个`bitset`时,你需要在尖括号中指定位的数量。例如,`bitset<8>`创建了一个可以存储8位的`bitset`。 ```cpp #include #include int main() { std::bitset<8> bits(0b11010010); // 从二进制数初始化 //std::bitset<8> bits(8);//也可以用十进制初始化 std::cout << bits << std::endl; } ``` ### 常用成员函数 - `set()`: 将所有位设置为1,或者指定位置的位设置为1。 - `reset()`: 将所有位设置为0,或者指定位置的位设置为0。 - `flip()`: 翻转所有位的状态,或者翻转指定位置的位。 - `test(pos)`: 检查在`pos`位置的位是否为1。 - `count()`: 返回`bitset`中设置为1的位的数量。 - `size()`: 返回`bitset`中位的数量。 - `to_string()`: 返回`bitset`的字符串表示,其中包含了`'0'`和`'1'`。 - `to_ulong()`和`to_ullong()`: 将`bitset`转换为无符号长整型或无符号长长整型数值。注意,如果`bitset`太大,无法用一个`unsigned long`或`unsigned long long`表示,则会抛出`std::overflow_error`异常。 ### 示例:位操作 ```cpp #include #include int main() { std::bitset<8> bits(0b10101010); // 初始化 // 设置和重置位 bits.set(1); // 将位置1的位设置为1 bits.reset(2); // 将位置2的位设置为0 std::cout << "After set and reset: " << bits << std::endl; // 翻转位 bits.flip(); // 翻转所有位 std::cout << "After flip: " << bits << std::endl; // 查询位 if (bits.test(0)) { // 测试位置0的位是否为1 std::cout << "Bit 0 is set." << std::endl; } // 统计设置为1的位数 std::cout << "Number of bits set: " << bits.count() << std::endl; // 转换为字符串 std::cout << "Bitset as string: " << bits.to_string() << std::endl; // 转换为数值 std::cout << "Bitset as number: " << bits.to_ulong() << std::endl; } ``` `bitset`提供了一种高效且易于使用的方式来处理位级操作,特别是当你需要操作的位数固定且相对较小时。它比手动使用位操作符更安全、更直观,而且能自动处理一些常见的错误情形,如索引越界。 --- ⬅️ [[高精度相关问题|高精度相关问题]] 🏠 [[00-刷题理模型]] ➡️ [[二进制优化|二进制优化]]