目录
概述
<bitset>
是 C++ 标准库中的容器类,用于表示固定大小的二进制位序列。它以位为单位存储数据,提供高效的位操作接口。<bitset>
的容量在编译时确定,不能动态调整。
包含头文件
#include <bitset>
#include <iostream>
定义格式
std::bitset<位数> 变量名;
位数
:模板参数,指定位数组的大小,必须是编译时常量(如8
、32
)。
基本特性
- 固定大小:大小在编译时确定,无法运行时改变。
- 高效位操作:支持按位与、或、异或、移位等操作。
- 紧凑存储:每个位占用 1 bit,内存效率高。
- 无迭代器:不支持 STL 风格的迭代器。
基本用法
声明和初始化
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b1; // 8 位全 0:00000000
std::bitset<8> b2(5); // 从整数初始化:00000101
std::bitset<8> b3("1010"); // 从字符串初始化:00001010
std::cout << "b1: " << b1 << std::endl; // 输出:00000000
std::cout << "b2: " << b2 << std::endl; // 输出:00000101
std::cout << "b3: " << b3 << std::endl; // 输出:00001010
return 0;
}
访问和修改位
#include <bitset>
#include <iostream>
int main() {
std::bitset<4> b(3); // 初始化为 0011
std::cout << "Original: " << b << std::endl;
b[0] = 0; // 修改第 0 位
b.set(2); // 将第 2 位设为 1
b.reset(1); // 将第 1 位设为 0
b.flip(3); // 翻转第 3 位
std::cout << "Modified: " << b << std::endl; // 输出:0100
std::cout << "Bit 2: " << b[2] << std::endl; // 输出:1
return 0;
}
[]
:访问或修改某位。set(pos)
:将某位置 1。reset(pos)
:将某位置 0。flip(pos)
:翻转某位。
位操作
#include <bitset>
#include <iostream>
int main() {
std::bitset<4> b1(5); // 0101
std::bitset<4> b2(3); // 0011
std::cout << "b1 & b2: " << (b1 & b2) << std::endl; // 输出:0001 (按位与)
std::cout << "b1 | b2: " << (b1 | b2) << std::endl; // 输出:0111 (按位或)
std::cout << "b1 ^ b2: " << (b1 ^ b2) << std::endl; // 输出:0110 (按位异或)
std::cout << "~b1: " << (~b1) << std::endl; // 输出:1010 (按位取反)
std::cout << "b1 << 1: " << (b1 << 1) << std::endl; // 输出:1010 (左移)
std::cout << "b1 >> 1: " << (b1 >> 1) << std::endl; // 输出:0010 (右移)
return 0;
}
查询和统计
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b("10100110");
std::cout << "b: " << b << std::endl;
std::cout << "Count of 1s: " << b.count() << std::endl; // 输出:4
std::cout << "All 1s? " << b.all() << std::endl; // 输出:0
std::cout << "Any 1s? " << b.any() << std::endl; // 输出:1
std::cout << "No 1s? " << b.none() << std::endl; // 输出:0
std::cout << "Test bit 2: " << b.test(2) << std::endl; // 输出:1
return 0;
}
count()
:统计 1 的个数。all()
:检查是否全为 1。any()
:检查是否有 1。none()
:检查是否全为 0。test(pos)
:检查某位是否为 1。
转换为其他类型
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b("1010"); // 00001010
std::cout << "As integer: " << b.to_ulong() << std::endl; // 输出:10
std::cout << "As string: " << b.to_string() << std::endl; // 输出:00001010
return 0;
}
to_ulong()
:转换为无符号长整数。to_string()
:转换为二进制字符串。
大小和状态
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b;
std::cout << "Size: " << b.size() << std::endl; // 输出:8
return 0;
}
size()
:返回位数(编译时常量)。- 无
empty()
,因大小固定。
与 <vector<bool>>
的对比
特性 | std::bitset | std::vector<bool> |
---|---|---|
大小 | 固定(编译时) | 动态(运行时) |
内存效率 | 每位 1 bit | 每位 1 bit(优化) |
位操作 | 丰富(与、或等) | 有限 |
迭代器 | 不支持 | 支持 |
动态调整 | 不支持 | 支持 |
注意事项
- 固定大小:无法动态调整,若需动态大小,使用
<vector<bool>>
。 - 越界访问:
[]
和test()
在越界时抛出std::out_of_range
。 - 性能:位操作高效,但不适合需要迭代的场景。
- 整数范围:
to_ulong()
若超出范围抛出std::overflow_error
。
实用示例:权限管理
#include <bitset>
#include <iostream>
enum Permission {
READ = 0,
WRITE = 1,
EXECUTE = 2
};
int main() {
std::bitset<3> perms; // 3 种权限
perms.set(READ); // 授予读权限
perms.set(EXECUTE); // 授予执行权限
std::cout << "Permissions: " << perms << std::endl; // 输出:101
if (perms.test(READ)) {
std::cout << "Has read permission" << std::endl;
}
if (!perms.test(WRITE)) {
std::cout << "No write permission" << std::endl;
}
return 0;
}
输出:
Permissions: 101
Has read permission
No write permission
小练习
问题
写一个 C++ 程序:
- 定义一个
std::bitset<8>
,初始化为二进制 “10101010”。 - 翻转第 3 位。
- 将第 5 位置为 0。
- 输出最终位序列和 1 的个数。
参考答案
#include <bitset>
#include <iostream>
int main() {
std::bitset<8> b("10101010"); // 初始化为 10101010
b.flip(3); // 翻转第 3 位:10111010
b.reset(5); // 将第 5 位置 0:10011010
std::cout << "Final bits: " << b << std::endl; // 输出:10011010
std::cout << "Count of 1s: " << b.count() << std::endl; // 输出:5
return 0;
}
参考资料
- C++ Standard Library Reference:
<bitset>
的官方文档。
- ISO/IEC 14882:2011 (C++11 Standard)
- cppreference.com: 提供
<bitset>
的详细说明和示例。 - The C++ Programming Language (4th Edition) by Bjarne Stroustrup: C++ 容器权威书籍。
- Effective STL by Scott Meyers: STL 容器实用建议。
出站链接
- cppreference.com: std::bitset – 官方文档和示例。
- C++ Reference: std::bitset – 接口说明。
- GeeksforGeeks: bitset in C++ – 教程和代码示例。
- LearnCpp: Introduction to std::bitset – 初学者教程。
下一步
- 如果你想试试练习,请提交代码,我会帮你检查。
- 如果需要更深入内容(如位运算优化、与
<dynamic_bitset>
对比),或设计测验题,请告诉我! - 你也可以提出具体问题,如“如何用
<bitset>
实现布隆过滤器?”或“<bitset>
的内存布局?”。
现在,你想做什么?试试练习,还是有其他需求?
发表回复