116 std::bitset


作者Lou Xiao, deepseek创建时间2025-04-02 17:44:58更新时间2025-04-02 17:44:58

1. 概述

std::bitset 是 C++ 标准库中的一个模板类,用于表示固定大小的位序列(二进制位集合)。它提供了一系列方便的方法来操作位序列。

2. 基本特性

  • 固定大小:在编译时确定大小,不能动态改变
  • 高效存储:每个位只占用1 bit空间
  • 位操作支持:支持各种位运算操作
  • 边界检查:可选的边界检查功能

3. 头文件

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #include <bitset>

4. 模板声明

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 template<size_t N> class bitset;
  • N:bitset的位数(大小)

5. 构造函数

构造函数描述
bitset()默认构造,所有位初始化为0
bitset(unsigned long val)用无符号长整数的二进制表示初始化
bitset(const string& str, size_t pos = 0, size_t n = string::npos, char zero = '0', char one = '1')从字符串构造
bitset(const char* str, size_t n = string::npos, char zero = '0', char one = '1')从C风格字符串构造

6. 常用成员函数

6.1 位访问

函数描述
bool operator[](size_t pos) const访问指定位置位的值(不检查边界)
reference operator[](size_t pos)返回可修改的位引用
bool test(size_t pos) const访问指定位置位的值(检查边界,越界抛出异常)

6.2 容量相关

函数描述
size_t size() const noexcept返回bitset的大小(位数N)
size_t count() const noexcept返回设置为1的位数
bool all() const noexcept检查是否所有位都为1
bool any() const noexcept检查是否有任何位为1
bool none() const noexcept检查是否没有位为1

6.3 位操作

函数描述
bitset& set()将所有位设置为1
bitset& set(size_t pos, bool val = true)设置指定位置位
bitset& reset()将所有位重置为0
bitset& reset(size_t pos)重置指定位置位
bitset& flip()翻转所有位
bitset& flip(size_t pos)翻转指定位置位

6.4 类型转换

函数描述
unsigned long to_ulong() const转换为unsigned long
unsigned long long to_ullong() const转换为unsigned long long
string to_string(char zero = '0', char one = '1') const转换为字符串

7. 运算符重载

7.1 位运算符

运算符描述
&按位与
\|按位或
^按位异或
~按位取反
<<左移
>>右移

7.2 比较运算符

运算符描述
==, !=相等性比较

7.3 流运算符

运算符描述
<<输出bitset到流
>>从流输入到bitset

8. 非成员函数

函数描述
std::hash<std::bitset>bitset的哈希支持

9. 示例代码

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #include <iostream>
2 #include <bitset>
3 #include <string>
4
5 int main() {
6 // 构造bitset
7 std::bitset<8> b1; // 00000000
8 std::bitset<8> b2(42); // 00101010
9 std::bitset<8> b3("10101010"); // 10101010
10
11 // 位操作
12 b1.set(); // 11111111
13 b1.reset(2); // 11111011
14 b1.flip(); // 00000100
15
16 // 访问位
17 bool bit = b2.test(1); // true (第1位是1)
18 b2[1] = 0; // 00101000
19
20 // 输出
21 std::cout << "b1: " << b1 << std::endl;
22 std::cout << "b2: " << b2.to_string() << std::endl;
23 std::cout << "b3: " << b3.to_ulong() << std::endl;
24
25 // 位运算
26 std::bitset<8> result = b2 & b3;
27 std::cout << "AND: " << result << std::endl;
28
29 return 0;
30 }

10. 应用场景

  1. 位标志集合
  2. 二进制数据表示
  3. 位掩码操作
  4. 状态压缩
  5. 哈希表实现

11. 注意事项

  1. 大小必须在编译时确定
  2. 转换为数值类型时可能抛出std::overflow_error
  3. 位序是从右向左编号(最右边是第0位)
  4. 与C风格位操作相比,提供了更安全的接口

12. 性能考虑

  • 通常比手动位操作更安全但可能稍慢
  • 适合需要固定大小位集合的场景
  • 对于非常大量的位,考虑std::vector<bool>或专用库

std::bitset 的常用 API 整理表格

名称用途原型代码示例注释
构造函数创建 bitset 对象bitset();
bitset(unsigned long val);
bitset(const string& str, size_t pos, size_t n);
std::bitset<8> b1;
std::bitset<8> b2(42);
std::bitset<8> b3("101010", 2, 4);
默认构造全 0;整数初始化;字符串从 pos 开始截取 n 位(默认全字符串)。
operator[]访问或修改指定位bool operator[](size_t pos) const;
reference operator[](size_t pos);
std::bitset<8> b(5);
bool bit = b[2];
b[0] = 1;
返回第 pos 位(从 0 开始),非 const 版本可修改。
test检查指定位的值(带边界检查)bool test(size_t pos) const;if (b.test(3)) { /*...*/ }pos 越界抛出 std::out_of_range
set设置所有或特定位为 1bitset& set();
bitset& set(size_t pos, bool val = true);
b.set();
b.set(2, false);
无参数时全置 1;指定位置 pos 设为 val(默认 true)。
reset重置所有或特定位为 0bitset& reset();
bitset& reset(size_t pos);
b.reset();
b.reset(3);
无参数时全置 0;指定位置 pos 置 0。
flip翻转所有或特定位bitset& flip();
bitset& flip(size_t pos);
b.flip();
b.flip(1);
无参数时全部取反;指定位置 pos 取反。
count返回设置为 1 的位数size_t count() const;size_t ones = b.count();统计 1 的个数。
size返回总位数(模板参数指定)size_t size() const;size_t bits = b.size();bitset<8> 返回 8。
any检查是否有任意位为 1bool any() const;if (b.any()) { /*...*/ }全 0 返回 false,否则 true
none检查是否所有位为 0bool none() const;if (b.none()) { /*...*/ }全 0 返回 true,否则 false
all检查是否所有位为 1bool all() const;if (b.all()) { /*...*/ }全 1 返回 true,否则 false
to_string转换为字符串(0/1 序列)string to_string(char zero = '0', char one = '1') const;std::string s = b.to_string();可选参数指定 0/1 的替代字符。
to_ulong转换为 unsigned longunsigned long to_ulong() const;unsigned long val = b.to_ulong();若超出 unsigned long 范围抛出 std::overflow_error
to_ullong转换为 unsigned long longunsigned long long to_ullong() const;auto val = b.to_ullong();需要 C++11 支持。
位运算符支持 &|^~<<>> 等位运算bitset operator&(const bitset& rhs) const;
(其他类似)
std::bitset<4> b3 = b1 & b2;运算符重载,返回新 bitset
流操作支持 <<>> 输入输出friend istream& operator>>(istream& is, bitset& b);
(输出类似)
std::cin >> b;
std::cout << b;
输入需合法 0/1 字符,输出为字符串格式。

示例代码片段

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #include <bitset>
2 #include <iostream>
3 #include <string>
4
5 int main() {
6 std::bitset<8> b1(10); // 00001010
7 std::bitset<8> b2("1010"); // 00001010
8
9 b1.set(0); // 00001011
10 b2.flip(); // 11110101
11
12 std::cout << "b1: " << b1 << ", count: " << b1.count() << std::endl;
13 std::cout << "b2: " << b2.to_string('-', '*') << std::endl; // 自定义字符显示
14
15 if (b1.any()) {
16 std::cout << "b1 has at least one bit set!" << std::endl;
17 }
18 return 0;
19 }

注释说明

  • 模板参数std::bitset<N>N 必须是编译时常量,表示位数。
  • 位序:位从右向左编号(0 开始),如 bitset<4>(5)0101
  • 异常test()to_ulong() 等可能抛出异常,需注意边界和范围检查。
文章目录