起因

2016年7月21日HDU的多校比赛第二场中倒数第二题“La Vie en rose”(5745)的题解用到了bitset压缩,本宝宝表示更本不知道什么是Bitset,于是自学一番,发现了一块专门用来DIY模拟的新大陆——STL Bitset

头文件

#include \

构造与初始化

细节

初始化bitset对象时总是从子串最右边结尾字符开始的

构造函数

bitset b;
b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则”b0”为”00000”;

bitset b(unsigned long u);
b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则”b0”为”00101”;

bitset b(string s);
b是string对象s中含有的位串的副本
string bitval ( “10011” );
bitset<5> b0 ( bitval4 );
则”b0”为”10011”;

bitset b(s, pos);
b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval (“01011010”);
bitset<10> b0 ( bitval5, 3 );
则”b0” 为 “0000011010”;

bitset b(s, pos, num);
b是s中从位置pos开始的num个位的副本,如果num b0 ( bitval5, 3, 6 );
则”b0” 为 “100110”;

常用函数

代码 作用
os << b 把b中的位集输出到os流
os >>b 输入到b中,如”cin>>b”,如果输入的不是0或1的字符,只取该字符前面的二进制位.
bool any( ) 是否存在置为1的二进制位?和none()相反
bool none( ) 是否不存在置为1的二进制位,即全部为0?和any()相反.
size_t count( ) 二进制位为1的个数.
size_t size( ) 二进制位的个数
flip() 把所有二进制位逐位取反
flip(size_t pos) 把在pos处的二进制位取反
bool operator 获取在pos处的二进制位
set() 把所有二进制位都置为1
set(pos) 把在pos处的二进制位置为1
reset() 把所有二进制位都置为0
reset(pos) 把在pos处的二进制位置为0
test(pos) 在pos处的二进制位是否为1?
unsigned long to_ulong( ) 用同样的二进制位返回一个unsigned long值
string to_string () 返回对应的字符串.

代码

这是一段助于理解的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
int main(){
//初始化
bitset <5> b1;
cout<<"b1 = "<<b1<<endl;
bitset <5> b2 (5);
cout<<"b2 = "<<b2<<endl;
string s="1001101001";
bitset <5> b3 (s);//截取了s的前五位
cout<<"b3 = "<<b3<<endl;
bitset <5> b4 (s,6);//从s[6]开始截取
cout<<"b4 = "<<b4<<endl;
bitset <5> b5 (s,3,3);//从s[3]开始截取3位,前导补充0
cout<<"b5 = "<<b5<<endl;
bitset <10> b6;
cout<<"输入一个bitset"<<endl;
cin >> b6;
cout<<"b6 = "<<b6<<endl;
cout<<" "<<b6.any()<<endl;
cout<<"b6 的长度是 "<<b6.size()<<endl;
cout<<"b6 中有 "<<b6.count()<<" 个零"<<endl;
cout<<"b6 取反 "<<b6.flip()<<endl;
cout<<"b6 第三位是否是 1 ? (1 =yes,0 = no) "<<b6.test(3)<<endl;
return 0;
}