算法训练营:提高篇(全彩版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 bitset(位图)

bitset 是位图。位图是一个多位二进制数,每一位都存放某种状态,适用于有海量数据、数据无重复的场景,例如:快速查找某个数据是否在一个集合中;排序及去重;求两个集合的交集、并集等;标记操作系统中的磁盘块。用bitset时,需要引入头文件#include<bitset>。

“bitset<1000>s;”表示定义一个1000位的二进制数s,右侧为低位,左侧为高位,其位序自右向左为0~999。既可以通过“[]”操作符直接得到第k位的值,也可以通过赋值操作改变该位的值。例如“s[k]=1”表示将二进制数s的第k位设置为1。基本的位运算有~(取反)、&(与)、|(或)、^(异或)、>>(右移)、<<(左移)、==(相等比较)、!=(不相等比较)。

bitset的成员函数如下。

· count():统计有多少位是1。

· any():若至少有一位是1,则返回true,否则返回false。

· none():若没有位是1(全为0),则返回true,否则返回false。

· set():将所有位都设置为1。

· set(k):将第k位设置为1,即s[k]=1。

· set(k,val):将第k位设置为val,即s[k]=val。

· reset():将所有位都设置为0。

· reset(k):将第k位设置为0,即s[k]=0。

· flip():将所有位都取反。

· flip(k):将第k位取反。

· size():返回位图的大小(位数)。

· to_ulong():返回将它转换为unsigned long类型的结果,若超出范围,则报错。

· to_string():返回将它转换为string类型的结果。