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. 应用场景
- 位标志集合
- 二进制数据表示
- 位掩码操作
- 状态压缩
- 哈希表实现
11. 注意事项
- 大小必须在编译时确定
- 转换为数值类型时可能抛出
std::overflow_error
- 位序是从右向左编号(最右边是第0位)
- 与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 | 设置所有或特定位为 1 | bitset& set(); bitset& set(size_t pos, bool val = true); | b.set(); b.set(2, false); | 无参数时全置 1;指定位置 pos 设为 val (默认 true)。 |
reset | 重置所有或特定位为 0 | bitset& 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 | 检查是否有任意位为 1 | bool any() const; | if (b.any()) { /*...*/ } | 全 0 返回 false ,否则 true 。 |
none | 检查是否所有位为 0 | bool none() const; | if (b.none()) { /*...*/ } | 全 0 返回 true ,否则 false 。 |
all | 检查是否所有位为 1 | bool 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 long | unsigned long to_ulong() const; | unsigned long val = b.to_ulong(); | 若超出 unsigned long 范围抛出 std::overflow_error 。 |
to_ullong | 转换为 unsigned long long | unsigned 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()
等可能抛出异常,需注意边界和范围检查。
文章目录