ACM模版

bitset

STL 的头文件中 <bitset> <script type="math/tex" id="MathJax-Element-2"> </script> 中定义了模版类 bitset ,用来方便地管理一系列的 bit 位的类。 bitset 除了可以访问指定下标的 bit 位以外,还可以把它们作为一个整数来进行某些统计。

bitset 模板类需要一个模版参数,用来明确指定含有多少位。

定义 bitset 对象的示例代码:

const int MAXN = 32;

bitset<MAXN> bt;            // bt 包括 MAXN 位,下标 0 ~ MAXN - 1,默认初始化为 0
bitset<MAXN> bt1(0xf);      // 0xf 表示十六进制数 f,对应二进制 1111,将 bt1 低 4 位初始化为 1
bitset<MAXN> bt2(012);      // 012 表示八进制数 12,对应二进制 1010,即将 bt2 低 4 位初始化为 1010
bitset<MAXN> bt3("1010");   // 将 bt3 低 4 位初始化为 1010
bitset<MAXN> bt4(s, pos, n);// 将 01 字符串 s 的 pos 位开始的 n 位初始化 bt4

bitset 基本操作:

bt.any()        // bt 中是否存在置为 1 的二进制位?
bt.none()       // bt 中不存在置为 1 的二进制位吗?
bt.count()      // bt 中置为 1 的二进制位的个数
bt.size()       // bt 中二进制位的个数
bt[pos]         // 访问 bt 中在 pos 处的二进制位
bt.test(pos)    // bt 中在 pos 处的二进制位是否为 1
bt.set()        // 把 bt 中所有二进制位都置为 1
bt.set(pos)     // 把 bt 中在 pos 处的二进制位置为 1
bt.reset()      // 把 bt 中所有二进制位都置为 0
bt.reset(pos)   // 把 bt 中在pos处的二进制位置为0
bt.flip()       // 把 bt 中所有二进制位逐位取反
bt.flip(pos)    // 把 bt 中在 pos 处的二进制位取反
bt[pos].flip()  // 同上
bt.to_ulong()   // 用 bt 中同样的二进制位返回一个 unsigned long 值
os << bt        // 把 bt 中的位集输出到 os 流

ExampleOne:

#include <iostream>
#include <bitset>

using namespace std;

const int MAXN = 32;

bitset<MAXN> bt(0x3f3f3f3f);

int main()
{
    cout << bt << '\n';

    return 0;
}

程序执行的输出结果为:
00111111001111110011111100111111