bitset
2025-08-14 10:04:40
发布于:广东
🧠 C++ std::bitset
📚 一、学习目标
- 理解什么是 bitset
- 学会创建和初始化 bitset
- 掌握 bitset 的基本操作方法
- 应用 bitset 解决实际问题(例如位运算、状态管理等)
⚙️ 二、基础知识讲解
1. 概念:什么是 std::bitset
?
std::bitset
是 C++ STL(标准模板库)中的一种容器类,用于操作固定大小的二进制数(即位序列)。
bitset
中的每一位只能是0
或1
。- 每个
bitset
在定义时需要指定位的个数(长度 N),例如:std::bitset<8>
表示一个8位的位集。 - 它在头文件
<bitset>
中定义。
2. 创建 & 初始化 bitset
语法:
#include <bitset>
std::bitset<N> name;
示例:
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<4> b1; // 默认初始化:0000
bitset<4> b2(string("1010")); // 从字符串初始化
bitset<8> b3(255); // 从整数初始化(转换为二进制)
cout << "b1: " << b1 << endl; // 输出:0000
cout << "b2: " << b2 << endl; // 输出:1010
cout << "b3: " << b3 << endl; // 输出:11111111
}
3. 常用成员函数
方法 | 说明 | 示例 |
---|---|---|
test(pos) |
返回第 pos 位是否为 1 | b2.test(0) → true |
set(pos) |
设置第 pos 位置为 1 | b1.set(1); (第1位变为1) |
reset(pos) |
设置第 pos 位置为 0 | b2.reset(3); |
flip(pos) |
翻转 pos 位的值 | b1.flip(2); |
any() |
至少有一位是 1 返回 true | b1.any() |
none() |
没有 1 返回 true | b1.none() |
all() |
全是 1 返回 true | b3.all() |
count() |
返回 1 的个数 | b3.count() → 8 |
size() |
返回总位数 | b2.size() → 4 |
to_string() |
转换为字符串 | b2.to_string() → "1010" |
to_ulong() |
转换为 unsigned long 整数 | b2.to_ulong() → 10 |
to_ullong() |
转换为 unsigned long long | b2.to_ullong() → 10 |
4. bitset 的访问与修改
- 可以像数组一样访问:
bitset<4> b("1010"); cout << b[0] << endl; // 输出:0 b[0] = 1; cout << b << endl; // 输出:1011
注意:下标从 最右一位 开始,即索引0是最右边的最低位(LSB)!
5. 位运算支持
bitset
支持以下逻辑运算符:
运算符 | 说明 | 示例 |
---|---|---|
& |
按位与 | b1 & b2 |
| |
按位或 | `b1 |
^ |
按位异或 | b1 ^ b2 |
~ |
按位非 | ~b1 |
<< |
左移 n 位 | b1 << 2 |
>> |
右移 n 位 | b1 >> 1 |
示例代码:
bitset<4> b1("1100"), b2("1010");
cout << (b1 & b2) << endl; // 1000
cout << (b1 | b2) << endl; // 1110
cout << (b1 ^ b2) << endl; // 0110
cout << (~b1) << endl; // 0011
cout << (b1 >> 1) << endl; // 0110
💡 三、实际应用场景
使用场景 | 示例 |
---|---|
权限控制 | 每一位代表一种权限 |
数据压缩 / 位图 | 用一个位表示真/假的状态 |
图算法中节点访问状态记录 | 代替布尔数组 |
集合运算、逻辑运算 | 用位运算模拟集合操作 |
例:权限管理系统
#include <iostream>
#include <bitset>
using namespace std;
int main() {
const int READ = 0;
const int WRITE = 1;
const int EXECUTE = 2;
bitset<3> permissions; // 初始为 000
permissions.set(READ); // 001
permissions.set(WRITE); // 011
cout << "Has READ: " << permissions.test(READ) << endl;
cout << "Has EXECUTE: " << permissions.test(EXECUTE) << endl;
}
📚 四、课堂练习
🧪 练习 1:打印二进制
写一个函数,输入一个整数,输出它的 16 位二进制表示。
示例:
Input: 10
Output: 0000000000001010
🧪 练习 2:统计二进制中 1 的个数
使用 bitset
实现一个函数:输入整数,返回其二进制中 1 的个数。
示例:
Input: 255
Output: 8
🧪 练习 3:模拟多选开关
有一个有 10 个选项的开关面板,用 bitset
来表示用户的选择状态,实现如下功能:
- 用户按下某个开关,设置相应位为 1
- 显示当前选择的选项个数
- 翻转第 3 个开关状态
🧩 五、扩展学习
更大数据规模?
bitset
是固定大小,如果需要动态大小位集合,请选择vector<bool>
或boost::dynamic_bitset
。
和 bool 数组相比?
比较项 | bitset |
bool[] /vector<bool> |
---|---|---|
内存占用 | 更小(压缩) | 1 bit/1 字节 |
方法封装 | 有位操作方法 | 无 |
性能优化 | 更快的位运算 | 需手动实现 |
易读性 | 更清晰 | 操作复杂 |
📦 六、完整示例代码汇总
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main() {
bitset<8> b1;
bitset<8> b2(string("01101111"));
bitset<8> b3(45);
cout << "b1 : " << b1 << endl;
cout << "b2 : " << b2 << endl;
cout << "b3 : " << b3 << endl;
b2.set(7); // 设置最高位为 1
cout << "b2 updated: " << b2 << endl;
cout << "Count of 1s: " << b2.count() << endl;
// 位运算示例
bitset<8> b4 = b2 & b3;
cout << "AND result: " << b4 << endl;
// 转化为字符串和整数
string s = b2.to_string();
unsigned long val = b2.to_ulong();
cout << "String: " << s << endl;
cout << "ULong: " << val << endl;
}
全部评论 6
老师真优秀,这么长的总结写的真好,孩子也很喜欢
2天前 来自 广东
1很优质,孩子很喜欢
2天前 来自 广东
1有实力、
```有实力、
2天前 来自 广东
1666怎么有时间发
2天前 来自 广东
02天前 来自 广东
0孩子很喜欢
2天前 来自 广东
0
有帮助,赞一个