# std::bitset

< cpp‎ | utility

定义于头文件 `<bitset>` |  |
template< std::size_t N > class bitset; |  |

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

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

### 模板形参

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

### 成员类型

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

### 成员函数

(构造函数) | 构造 bitset (公开成员函数)
operator==operator!= (C++20 中移除) | 比较其内容 (公开成员函数)
##### 元素访问
operator[] | 访问指定的位 (公开成员函数)
test | 访问特定位 (公开成员函数)
all any none (C++11) | 检查是否所有、任一或无位被设为 true (公开成员函数)
count | 返回设置为 true 的位的数量 (公开成员函数)
##### 容量
size | 返回位集保有的位数 (公开成员函数)
##### 修改器
operator&=operator|=operator^=operator~ | 进行二进制与、或、异或及非 (公开成员函数)
operator<<=operator>>=operator<<operator>> | 进行二进制左移和右移 (公开成员函数)
set | 将位置为 true 或者提供的值 (公开成员函数)
reset | 将位置为 false (公开成员函数)
flip | 翻转位的值 (公开成员函数)
##### 转换
to_string | 返回数据的字符串表示 (公开成员函数)
to_ulong | 返回数据的 unsigned long 整数表示 (公开成员函数)
to_ullong (C++11) | 返回数据的 unsigned long long 整数表示 (公开成员函数)

### 非成员函数

operator&operator|operator^ | 在 bitset 上执行二元逻辑操作 (函数)
operator<<operator>> | 执行 bitset 的流输入和输出 (函数)

### 辅助类

std::hash<std::bitset> (C++11) | std::bitset 的散列支持 (类模板特化)

### 注解

若在编译时 bitset 的大小未知，则可使用 `std::vector<bool>` 或 `boost::dynamic_bitset` 。

### 示例

    #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

### 参阅

vector<bool> | 节省空间的动态 bitset (类模板特化)
位操纵 (C++20) | 用于访问、操纵和处理单独的位和位序列的工具