std::bitset

来自cppreference.com
< cpp‎ | utility
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
bitset
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
 
在标头 <bitset> 定义
template< std::size_t N >
class bitset;

类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作bitset,并将它与字符串和整数相互转换。

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

std::bitset 的所有成员函数都有 constexpr:这使得在常量表达式的求值中创建和使用 std::bitset 对象成为可能。

(C++23 起)

模板形参

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

成员类型

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

成员函数

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

非成员函数

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

辅助类

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

注解

若在编译时 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 <iostream>
 
int main()
{
    // 构造函数:
    constexpr std::bitset<4> b1;
    constexpr std::bitset<4> b2{0xA}; // == 0B1010
    std::bitset<4> b3{"0011"}; // 尚不能为 constexpr
    std::bitset<8> b4{"ABBA", /*length*/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 = */ 1, true); assert(b3 == 0b0010);
    b3.set(/* position = */ 1, false); assert(b3 == 0);
    b3.flip(/* position = */ 2); assert(b3 == 0b0100);
    b3.reset(/* position = */ 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) 用于访问、操纵和处理单独的位和位序列的工具