std::bitset

来自cppreference.com
< cpp‎ | utility
 
 
 
 
在标头 <bitset> 定义
template< std::size_t N >
class bitset;

类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作 bitset,并将它与字符串和整数相互转换。对于字符串表示和移位操作的列举方向来说,这个序列被当做最低索引元素位于右侧,类似于整数的二进制表示。

bitset 满足可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable) 的要求。

std::bitset 的全部成员函数均为 constexpr:在常量表达式求值中创建并使用 std::bitset 对象是可能的。

(C++23 起)

模板形参

N-要为 bitset 分配存储的位数

成员类型

表示到一个位的引用的代理类
(类)

成员函数

构造位集
(公开成员函数)
(C++20 移除)
比较其内容
(公开成员函数)
元素访问
访问指定的位
(公开成员函数)
访问特定位
(公开成员函数)
检查是否所有位,有任何位或没有位被设为 true
(公开成员函数)
返回设置为 true 的位的数量
(公开成员函数)
容量
返回位集保有的位数
(公开成员函数)
修改器
进行二进制与、或、异或及非
(公开成员函数)
进行二进制左移和右移
(公开成员函数)
将位置为 true 或者给定的值
(公开成员函数)
将位置为 false
(公开成员函数)
翻转位的值
(公开成员函数)
转换
返回数据的字符串表示
(公开成员函数)
返回数据的 unsigned long 整数表示
(公开成员函数)
(C++11)
返回数据的 unsigned long long 整数表示
(公开成员函数)

非成员函数

在 bitset 上执行二元逻辑操作
(函数)
执行 bitset 的流输入和输出
(函数)

辅助类

std::bitset 的散列支持
(类模板特化)

注解

若某个位集合在编译时大小未知,或者必须在运行时改变其大小,则可代之以使用 std::vector<bool>boost::dynamic_bitset 之类的动态类型。

功能特性测试标准功能特性
__cpp_lib_constexpr_bitset202207L(C++23)使 std::bitset 更 constexpr
__cpp_lib_bitset202306L(C++26)std::bitsetstd::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)用于访问、操纵和处理单独的位和位序列的工具