#edu010. 学习材料 - bitset
学习材料 - bitset
Update 2025-12-30
为了更好理解和应用 bitset 于是更新了教程。
1.什么是 bitset
bitset 是 C++STL 中的一种容器类,方便表示和操作固定长度的二进制数。
-
头文件
<bitset> -
定义的时候指定二进制个数(长度 N), 例如
bitset<100>a,定义了一个 长度为 100 的二进制序列a -
bitset中每一位只能是 0 或 1 -
长度为 的
bitset, 空间复杂度为
2.为什么需要定义 bitset
int 和 long long 只能状压表示 32/64 位状态,如果需要状压表示更长的状态属性(状态属性只有两种),那么就可以使用 bitset
3. 常用函数
-
构造函数 (定义变量自动运行)
bitset(): 每一位都是 false。bitset(unsigned long val): 设为val的二进制形式。例如,bitset<8> a(7), 表示定义并初始化为二进制00000111;bitset(const string& str): 设为01串str。例如,bitset<8> a("01011"),a就初始化为00001011, 从低位开始初始化.
-
成员函数
以下表格 ,定义 bitset<4>a("0101");
| 函数名 | 含义 | 示例 |
|---|---|---|
size() |
返回总位数 | cout<<a.size();//4 |
count() |
返回 1 的个数 |
cout<<a.count();//2 |
any() |
至少有一位是 1 返回 true |
a.any();//true |
none() |
没有 1 返回 true |
a.none()//false |
all() |
全是 1 返回 true |
a.all()//false |
reset([pos]) |
设置第 pos 位置为 0, pos 缺省,全部设置为 0 |
a.set(1)等价于 a[1]=1 |
flip([pos]) |
翻转 pos 位置的值,pos 缺省,全部翻转 |
a.flip(1) 等价于 a[1]=a[1]^1 |
to_string() |
转换为字符串 | a.to_string() ("0101") |
to_ulong() |
转换为 unsigned long 整数 | a.to_ulong()(5) |
to_ullong |
转换为 unsigned long long | a.to_ullong() (5) |
4. 位运算符
bitset 支持的位运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
& |
按位与 | a&b |
| |
按位或 | a|b |
^ |
按位异或 | a^b |
~ |
按位非 | ~a |
<< |
左移 n 位 | a<<2 |
>> |
右移 n 位 | a>>1 |
示例:
bitset<4> a("1100"), b("1010");
cout << (a & b) << endl; // 1000
cout << (a | b) << endl; // 1110
cout << (a ^ b) << endl; // 0110
cout << (~a) << endl; // 0011
cout << (a >> 1) << endl; // 0110
之前的教程
位运算操作符
~s: 返回对 bitset s 按位取反的结果。
&,|,^ : 返回对每个位数相同的 bitset 执行按位与、或、异或运算的结果。
>>,<<: 返回把一个 bitset 右移、左移若干位的结果。
==,!=: 比较两个 bitset 代表的二进制数是否相等。
[ ] 操作符
s[k] 表示 s 的第 k 位,既可以取值,也可以赋值。
在 位二进制数中,最低位为 s[0],最高位为 s[9999].
count()
s.count() 返回有多少位为 。
any()/none()
若 s 所有位都为 0 ,则 s.any() 返回 false , s.none() 返回 true.
若 s 至少一位为 1,则 s.any() 返回 true , s.none() 返回 false.
set()/reset()/flip()
s.set() 把 s 所有位变为 1 。
s.set(k,v) 把 s 的第 k 位改为 v,即 s[k]=v。
s.reset() 把 s 所有位变为 0。
s.reset(k) 把 s 的第 k 位改为 0 ,即 s[k]=0 。
s.flip() 把 s 的所有位取反, 即 s=~s 。
s.flip(k) 把 s 的第 k 位取反,即 s[k]^=1。
学习完毕
{{ select(1) }}
- YES
- NO