std::bitset是C++中编译期确定大小的静态位容器,零开销、内存紧凑、操作高效,适用于状态标记、权限控制等场景;大小N必须为constexpr,支持位运算、统计和转换方法,但不支持动态大小与迭代器。

std::bitset 是 C++ STL 中专为**编译期确定大小的位序列**设计的静态位容器,不是动态容器(不支持运行时改变大小),但胜在零开销、内存紧凑、操作高效,特别适合状态标记、权限控制、哈希布隆过滤器底层、算法竞赛中的位压缩等场景。
模板参数 N 必须是整型常量表达式(如字面量、constexpr 变量),不能是普通变量:
std::bitset flags; // 全0std::bitset mask("10101010"); // 从二进制字符串构造std::bitset val(42); // 从整数(转为二进制):42 → 00101010
int n = 16;<br>std::bitset<n> bad; // 编译错误
所有操作都是内联、无函数调用开销,编译器通常直接映射为 CPU 的 bit 指令(如 and, or, xor, bt, bts):
flags.set(3); // 置第3位(0-indexed)为1flags.reset(1); // 清第1位为0flags.flip(5); // 翻转第5位flags[2] = true; // 下标访问(可读可写)bool b = flags.test(7); // 安全检查第7位是否为1(比 [] 更明确语义)flags &= mask; // 位与(支持复合赋值)auto res = a ^ b; // 位异或,返回新 bitset
避免手写循环,用内置方法提升可读性与性能:
flags.count(); // 返回1的个数(popcount),GCC/Clang 自动优化为 <code>popcnt 指令flags.size(); // 返回总位数 N(编译期常量)flags.any(); // 是否至少有一个1flags.none(); // 是否全为0flags.all(); // 是否全为1(C++11 起)
flags.to_ulong(); // 转为 unsigned long(需确保值不溢出)flags.to_ullong(); // C++11 起,支持 unsigned long longflags.to_string(); // 转为 string,高位在前(如 "00001010")
std::bitset 不是万能的:
std::vector<bool></bool>(空间优化特化)或手动管理 std::vector<uint64_t></uint64_t> + 位运算;以上就是c++++的std::bitset怎么用 高效的位操作容器【STL详解】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号