std::bitset
来自cppreference.com
在标头 <bitset> 定义
|
||
template< std::size_t N > class bitset; |
||
类模板 bitset
表示一个 N
位的固定大小序列。可以用标准逻辑运算符操作 bitset
,并将它与字符串和整数相互转换。对于字符串表示和移位操作的列举方向来说,这个序列被当做最低索引元素位于右侧,类似于整数的二进制表示。
bitset
满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssignable) 的要求。
|
(C++23 起) |
模板形参
N | - | 要为 bitset 分配存储的位数
|
成员类型
表示到一个位的引用的代理类 (类) |
成员函数
构造位集 (公开成员函数) | |
(C++20 中移除) |
比较其内容 (公开成员函数) |
元素访问 | |
访问指定的位 (公开成员函数) | |
访问特定位 (公开成员函数) | |
检查是否所有位,有任何位或没有位被设为 true (公开成员函数) | |
返回设置为 true 的位的数量 (公开成员函数) | |
容量 | |
返回位集保有的位数 (公开成员函数) | |
修改器 | |
进行二进制与、或、异或及非 (公开成员函数) | |
进行二进制左移和右移 (公开成员函数) | |
将位置为 true 或者给定的值 (公开成员函数) | |
将位置为 false (公开成员函数) | |
翻转位的值 (公开成员函数) | |
转换 | |
返回数据的字符串表示 (公开成员函数) | |
返回数据的 unsigned long 整数表示 (公开成员函数) | |
(C++11) |
返回数据的 unsigned long long 整数表示 (公开成员函数) |
非成员函数
在位集上执行二元逻辑操作 (函数) | |
执行位集的流输入和输出 (函数) |
辅助类
(C++11) |
std::bitset 的散列支持 (类模板特化) |
注解
若某个位集合在编译时大小未知,或者必须在运行时改变其大小,则可代之以使用 std::vector<bool> 或 boost::dynamic_bitset
之类的动态类型。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_constexpr_bitset |
202207L | (C++23) | 使 std::bitset 更 constexpr
|
__cpp_lib_bitset |
202306L | (C++26) | std::bitset 的 std::string_view 接口
|
示例
运行此代码
#include <bitset> #include <cassert> #include <cstddef> #include <iostream> int main() { typedef std::size_t length_t, position_t; // 提示 // 构造函数: constexpr std::bitset<4> b1; constexpr std::bitset<4> b2{0xA}; // == 0B1010 std::bitset<4> b3{"0011"}; // C++23 起也可以为 constexpr std::bitset<8> b4{"ABBA", length_t(4), /*0:*/'A', /*1:*/'B'}; // == 0B0000'0110 // 能打印出 bitset 到流: std::cout << "b1:" << b1 << "; b2:" << b2 << "; b3:" << b3 << "; b4:" << b4 << '\n'; // bitset 支持逐位运算: b3 |= 0b0100; assert(b3 == 0b0111); b3 &= 0b0011; assert(b3 == 0b0011); b3 ^= std::bitset<4>{0b1100}; assert(b3 == 0b1111); // 整个集合上的操作: b3.reset(); assert(b3 == 0); b3.set(); assert(b3 == 0b1111); assert(b3.all() && b3.any() && !b3.none()); b3.flip(); assert(b3 == 0); // 单独位上的操作: b3.set(position_t(1), true); assert(b3 == 0b0010); b3.set(position_t(1), false); assert(b3 == 0); b3.flip(position_t(2)); assert(b3 == 0b0100); b3.reset(position_t(2)); assert(b3 == 0); // 支持下标 operator[]: b3[2] = true; assert(true == b3[2]); // 其他操作: assert(b3.count() == 1); assert(b3.size() == 4); assert(b3.to_ullong() == 0b0100ULL); assert(b3.to_string() == "0100"); }
输出:
b1:0000; b2:1010; b3:0011; b4:00000110
参阅
节省空间的动态 bitset (类模板特化) | |
位操纵 (C++20) | 用于访问、操纵和处理单独的位和位序列的工具 |