Namespaces
Variants

std:: bitset

From cppreference.net
Utilities library
定义于头文件 <bitset>
template < std:: size_t N >
class bitset ;

类模板 bitset 表示一个由 N 个位组成的固定大小序列。位集可通过标准逻辑运算符进行操作,并可与字符串及整数相互转换。出于字符串表示和移位操作方向命名的考虑,该序列被视为最低索引元素位于 右侧 ,如同整数的二进制表示形式。

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

std::bitset 的所有成员函数均为 constexpr :可以在常量表达式求值过程中创建和使用 std::bitset 对象。

(since C++23)

目录

模板参数

N - 用于分配存储空间的位数

成员类型

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

成员函数

构造位集
(公开成员函数)
(removed in C++20)
比较内容
(公开成员函数)
元素访问
访问特定位
(公开成员函数)
访问特定位
(公开成员函数)
检查是否所有、任一或没有位被设置为 true
(公开成员函数)
返回被设置为 true 的位的数量
(公开成员函数)
容量
返回位集持有的位数
(公开成员函数)
修改器
执行二进制 AND、OR、XOR 和 NOT 运算
(公开成员函数)
执行二进制左移和右移操作
(公开成员函数)
将位设置为 true 或给定值
(公开成员函数)
将位设置为 false
(公开成员函数)
翻转位的值
(公开成员函数)
转换
返回数据的字符串表示
(公开成员函数)
返回数据的 unsigned long 整数表示
(公开成员函数)
(C++11)
返回数据的 unsigned long long 整数表示
(公开成员函数)

非成员函数

对位集执行二进制逻辑操作
(函数模板)
执行位集的流输入和输出操作
(function template)

辅助类

std::bitset 提供的哈希支持
(类模板特化)

注释

如果在编译时无法确定位集的大小,或者需要在运行时改变其大小,可以使用动态类型,例如 std::vector<bool> boost::dynamic_bitset<> 作为替代方案。

功能测试 标准 功能
__cpp_lib_constexpr_bitset 202207L (C++23) 更常量表达式的 std::bitset
__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
    // 位集可输出至流:
    std::cout << "b1:" << b1 << "; b2:" << b2 << "; b3:" << b3 << "; b4:" << b4 << '\n';
    // 位集支持位运算:
    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);
    // 支持下标运算符[]:
    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

参见

空间优化的动态位集
(类模板特化)
Bit manipulation (C++20) 用于访问、操作和处理单个位及位序列的工具