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_bitset 202207L (C++23) 使 std::bitset 更 constexpr
__cpp_lib_bitset 202306L (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) 用于访问、操纵和处理单独的位和位序列的工具