【笔记】C++库函数——bitset
看到有大佬掏出这个库函数,一愣。这绝对是未曾想象过的道路,长见识。有时候做题总能碰见稀奇古怪的库函数,每个都令我大开眼界。以后看到感兴趣的都会记录一下,感觉是个好东西,算是学习道路上的小小积累吧,抓紧记录一下。
头文件
#include <bitset>
using std::bitset;
定义与初始化
bitset<n> b; //b有n位,每位都是0
bitset<n> b(u); //b是unsigned long型u中的一个副本
bitset<n> b(s); //b是string对象s中含有位串的副本
bitset<n> b(s,pos,n); //b是s中从pos位置开始的n个位的副本
类似于vector,bitset类是一种类模板;与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值
bitset操作
b.any() | b中是否存在置为1的二进制位? |
---|---|
b.none() | b中不存在置为1的二进制位? |
b.count() | b中置为1的二进制个数 |
b.size() | b中二进制位的个数 |
b[pos] | 访问b中在pos处的二进制位 |
b.test(pos) | b中在pos处的二进制位是否为1? |
b.set()/b.set( p ) | 把b中二进制位都置1/将第p+1位置1 |
b.reset()/b.reset( p ) | 把b中二进制位都置0/将第p+1位置0 |
b.flip() | 把b中的位数都取反 |
b.to_ulong() | 把b中同样的二进制位返回一个unsigned_long值,如果超出范围会报错 |
此外,bitset运算也像普通整数一样,可以进行与、或、异或、左移、右移等操作。
#include <iostream>
#include <string>
#include <bitset>
int main ()
{
std::bitset<4> foo (std::string("1001"));
std::bitset<4> bar (std::string("0011"));
std::cout << (foo^=bar) << '\n'; // 1010 (XOR,assign)
std::cout << (foo&=bar) << '\n'; // 0010 (AND,assign)
std::cout << (foo|=bar) << '\n'; // 0011 (OR,assign)
std::cout << (foo<<=2) << '\n'; // 1100 (SHL,assign)
std::cout << (foo>>=1) << '\n'; // 0110 (SHR,assign)
std::cout << (~bar) << '\n'; // 1100 (NOT)
std::cout << (bar<<1) << '\n'; // 0110 (SHL)
std::cout << (bar>>1) << '\n'; // 0001 (SHR)
std::cout << (foo==bar) << '\n'; // false (0110==0011)
std::cout << (foo!=bar) << '\n'; // true (0110!=0011)
std::cout << (foo&bar) << '\n'; // 0010
std::cout << (foo|bar) << '\n'; // 0111
std::cout << (foo^bar) << '\n'; // 0101
return 0;
}
参考胡小兔的博客