STL——bitset的使用方法
bitset
介绍
类似 \(bool\) 数组一样的东西,储存的是二进制,但是每一位只占 \(1bit\),可以优化你算法的时间和空间复杂度。
储存
开一个bitset为:
bitset<100>bs;
最左边为最低位(即第 \(0\) 位),最右边为最高位。
在初始化的时候,是从最低位开始储存。
初始化
有两种初始化
- 整数
bitset<10>bs(657);//(625)_10=(1010010001)_2
- 字符串(string)
bitset<10>bs("1010010001");
储存的都是
1000100101
注意:如果在这个里面,bitset 开了更高的位数,则会在之后添加后缀 \(0\) (也就是二进制)。
举个例子,如果
bitset<11>bs(657);
储存的是
10001001010
输出
bitset<10>bs("1010010001");
signed main(){
cout<<bs<<"\n";//直接输出
printf("%d",bs);//转整形输出,注意bitset返回为int,所以位数最大开到64
return 0;
}
输出为
1010010001
657
注意:cout输出时是从最高位向最低为输出(也是二进制)
输入
bitset<10>bs;
signed main(){
cin>>bs;
scanf("%d",&bs);
return 0;
}
单个位
- 强转
(bool)bs[2]
- \(test\)函数
bs.test(s)//是否是1
\(test\) 更快一点。
位运算
bitset支持所有位运算
允许 ~,&,|,^,<<,>>
函数
bs.size() 返回大小(位数)
bs.count() 返回1的个数
bs.any() 返回是否有1
bs.none() 返回是否没有1
bs.all() 返回是否全部为1
bs.set() 全都变成1
bs.set(p) 将第p位变成1(注意:bitset是从第0位开始的)
bs.set(p, x) 将第p位变成x
bs.reset() 全都变成0
bs.reset(p) 将第p位变成0
bs.flip() 全都取反
bs.flip(p) 将第p位取反
bs.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
bs.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
bs.to_string() 返回它转换为string的结果
bs._Find_first() 返回它从小到大第一个为 1 的位数
bs._Find_next(x) 返回第x位之后(不包括x)它从小到大第一个为 1 的位数
完结撒花!