底层数据结构

编译期定长的二进制位数组。每一位占 1 bit,底层通常以 unsigned long 数组存储,每 64 位一组进行批量位运算。长度 N 必须是编译期常量。空间仅需 N/8 字节,远优于 bool[N](N 字节)和 vector<bool>

复杂度

操作复杂度说明
b[i]O(1)读写第 i 位(i=0 为最低位)
test(i)O(1)读第 i 位,带越界检查
set / reset / flipO(n/64)批量操作,每 64 位一次
count / any / none / allO(n/64)按组统计
& / | / ^O(n/64)按位运算
<< / >>O(n/64)移位
to_string / to_ulongO(n)格式转换

关键方法

方法说明
b[i]访问第 i 位(最低位 i=0),可读写
b.test(i)测试第 i 位是否为 1,越界抛 out_of_range
b.set() / b.set(i, v)全置 1 / 第 i 位置为 v
b.reset() / b.reset(i)全置 0 / 第 i 位置 0
b.flip() / b.flip(i)全翻转 / 第 i 位翻转
b.size()总位数(编译期常量)
b.count()值为 1 的位数
b.any() / b.none() / b.all()存在 1 / 全 0 / 全 1
~b / b1 & b2 / b1 | b2 / b1 ^ b2取反/与/或/异或
b << n / b >> n左移/右移 n 位
b.to_string()转二进制串(高位在前)
b.to_ulong() / b.to_ullong()转无符号整数

伪代码示例

bitset<8> bs

// 置位(最低位是第 0 位)
bs.set(0)                // bit 0 = 1
bs.set(3, 1)             // bit 3 = 1
bs[5] = 1                // bit 5 = 1
print bs                 // 00101001(高位在前)

// 统计
print bs.count()         // 3
print bs.size()          // 8

// 位运算
bs2 = bs << 1            // 左移一位
result = bs & bs2        // 按位与

// 翻转
bs.flip()                // 所有位取反

// 重置
bs.reset()               // 全部清零

// 状态压缩 DP(砝码称重)
bitset<MAX_W+1> dp
dp[0] = 1
for each weight w:
    for each count c:
        dp = dp | (dp << w)

// 可达性:dp[x] = 1 表示能称出重量 x

// 传递闭包(bitset 优化 Floyd)
bitset<N> reach[N]
for each edge u -> v:
    reach[u][v] = 1
for each k in 0..N-1:
    for each i in 0..N-1:
        if reach[i][k]:
            reach[i] = reach[i] | reach[k]

相关链接