
bitset
vector<bool>
在我日常工作中,处理一些状态标记或者集合运算时,
bitset
使用
bitset
std::bitset<100>
bitset
它提供了一系列非常方便的成员函数来操作这些位:
set()
reset()
flip()
test(pos)
count()
size()
bitset
any()
none()
all()
to_ulong()
to_ullong()
bitset
to_string()
更棒的是,它直接支持位运算符,比如
&
|
^
~
<<
>>
举个例子,如果你想快速判断一个数是否在一个很大的集合里,或者想实现一个简单的布隆过滤器,
bitset
std::vector<bool>
bitset
#include <iostream>
#include <bitset>
#include <string>
int main() {
// 声明一个10位的bitset
std::bitset<10> b1; // 默认所有位为0
std::cout << "b1 (default): " << b1 << std::endl; // 输出: 0000000000
// 从整数初始化
std::bitset<10> b2(5); // 5的二进制是101,所以是0000000101
std::cout << "b2 (from 5): " << b2 << std::endl; // 输出: 0000000101
// 设置位
b1.set(0); // 设置第0位为1
b1.set(3); // 设置第3位为1
std::cout << "b1 after set: " << b1 << std::endl; // 输出: 0000001001
// 测试位
if (b1.test(0)) {
std::cout << "Bit 0 is set." << std::endl;
}
// 翻转位
b1.flip(0); // 翻转第0位
std::cout << "b1 after flip(0): " << b1 << std::endl; // 输出: 0000001000
// 位操作
std::bitset<10> b3(std::string("1100101000"));
std::cout << "b3: " << b3 << std::endl;
std::bitset<10> b_and = b1 & b3;
std::cout << "b1 & b3: " << b_and << std::endl; // 输出: 0000001000 (因为b1只有第3位是1,b3第3位也是1)
// 统计1的个数
std::cout << "Count of set bits in b3: " << b3.count() << std::endl; // 输出: 4
return 0;
}bitset
在我看来,
bitset
一个就是布隆过滤器(Bloom Filter)的实现。当你需要快速判断一个元素是否“可能”存在于一个大型集合中,同时又想极大地节省内存时,布隆过滤器是首选,而它的核心就是
bitset
bitset
bitset
另一个就是状态压缩动态规划(State Compression DP)。在一些图论问题或组合优化问题中,我们需要用一个整数的二进制位来表示一个子集或一个状态。例如,旅行商问题(TSP)的一种经典解法就是用一个整数的位来表示已经访问过的城市集合。这时,
bitset
int
long long
bitset
再有就是位图(Bitmap)索引。在数据库或大型系统中,如果需要对某个列的布尔属性进行高效过滤,比如“用户是否活跃”、“商品是否在售”,直接用
bitset
bitset
最后,它在一些低级内存管理或硬件寄存器模拟的场景下也很有用。比如,如果你在嵌入式系统开发中需要精确控制某个硬件寄存器的位,或者在模拟某个协议的帧头时,
bitset
bitset
std::vector<bool>
选择
bitset
bitset
std::bitset<N>
N
bitset
std::vector<bool>
std::vector<bool>
push_back
resize
这种固定大小的特性,是
bitset
bitset
unsigned long long
unsigned long
至于它和
std::vector<bool>
std::vector<bool>
std::vector
std::vector<bool>
bool
std::vector<bool>
operator[]
bool&amp;
bool
std::vector<bool>
bool&amp;
相比之下,
bitset
bitset
bitset
std::vector<bool>
所以,我的经验是:
bitset
std::vector<bool>
bitset
尽管
bitset
首先,最明显的就是大小的固定性。前面也提到了,
bitset
bitset
std::vector<bool>
std::vector<char>
std::vector<unsigned long long>
其次,to_ulong()
to_ullong()
bitset
to_ulong()
unsigned long
bitset
to_ullong()
unsigned long long
bitset
std::overflow_error
bitset
bitset
bitset
再来,大尺寸bitset
bitset
bitset
std::bitset<100000000>
bitset
还有一点,虽然不算是陷阱,但值得注意的是位操作的边界条件和溢出。在使用左移
<<
>>
bitset
bitset
最后,虽然
bitset
bitset
以上就是bitset容器怎样应用 位操作高效处理方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号