起因
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”;5>
bitset b(unsigned long u);
b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则”b0”为”00101”;5>
bitset b(string s);
b是string对象s中含有的位串的副本
string bitval ( “10011” );
bitset<5> b0 ( bitval4 );
则”b0”为”10011”;5>
bitset b(s, pos);
b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval (“01011010”);
bitset<10> b0 ( bitval5, 3 );
则”b0” 为 “0000011010”;10>
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); cout<<"b3 = "<<b3<<endl; bitset <5> b4 (s,6); cout<<"b4 = "<<b4<<endl; bitset <5> b5 (s,3,3); 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; }
|