C++ Bitset类用法
- 定义和初始化
首先要使用bitset 类我们必须包含相关的头文件
#include <bitset>
然后可以如下声明一个该类型变量:
bitset<8>varm (M)
其中varm为变量名。
8表示该类型在内存中占的位数,是二进制。
M表示变量varm的初始值。
例如:
bitset的构造函数:
bitset<8>bit;//其中8就是bitset类型的bit指定所占空间大小
bitset<n> bit; //bit有n位,每位都为0
bitset<n> bit(s); //bit是string对象s中含有的位串的副本
#include<iostream>
#include<bitset>
#include<cstring>
using namespace std;
int main()
{
bitset<23>bit (string("11101001"));
cout<<bit<<endl;
bit=233;
cout<<bit<<endl;
return 0;
}
//结果
//00000000000000011101001
//00000000000000011101001*
bitset是STL的一个模板类,模板参数不是类型,而是整型数值,也同样可以像数组一样使用位。
#include<bitset>
bitset<8>bit; //声明了以bitset对象bs,bs可以装入8个bit,每一位都初始化为0
bit[0] = 1; //把0位置初始化1
bit[1] = 0; //把第1位置初始化0
bs[2] = true; //把第2位置初始化1(true转换为1)
bs[3] = false; //把第2位置初始化0(false转换为0)
- 常用的函数
对于一个叫做bit的bitset:
bit.size() 返回大小(位数)
bit.count() 返回1的个数
bit.any() 返回是否有1
bit.none() 返回是否没有1
bit.set() 全都变成1
bit.set(p) 将第p + 1位变成1(bitset是从第0位开始的!)
bit.set(p, x) 将第p + 1位变成x
bit.reset() 全都变成0
bit.reset(p) 将第p + 1位变成0
bit.flip() 全都取反
bit.flip(p) 将第p + 1位取反
bit.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
bit.to_string() 返回它转换为string的结果
3.基本运算
bitset支持所有的位运算:^,&,|
bitset<23>bita(string("11101001"));
bitset<23>bitb(string("11101000"));
cout<<(bita^bitb)<<endl;
//输出00000000000000000000001
bitset<23>bita(string("11101001"));
bitset<23>bitb(string("11101000"));
cout<<(bita|bitb)<<endl;
//输出00000000000000011101001
bitset<23>bita(string("11101001"));
bitset<23>bitb(string("11101000"));
cout<<(bita&bitb)<<endl;
//输出00000000000000011101000
bitset<23>bit(string("11101001"));
cout<<(bit<<5)<<endl;
//输出00000000001110100100000
bitset<23>bit(string("11101001"));
cout<<(bit>>5)<<endl;
//输出00000000000000000000111
4.例题
poj2443
题意:给n个集合,然后给出n个集合中的数字,n最大1000,数字最大10000。然后m组询问,问a,b这两个数是否同时属于某个集合
//用bitset解决
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<bitset>
using namespace std;
bitset<1005>bit[10005];//1005代表那些集合, maxn代表那些数的范围
int main()
{
for(int i = 0; i<10005; i++)
bit[i].reset();//将bit中每一个初始化为0
int n; scanf("%d",&n);
for(int i =0; i<n; i++)
{
int s; scanf("%d",&s);
for(int j = 0; j<s; j++)
{
int x; scanf("%d", &x);
bit[x][i] = 1 ; // 等于bit[x].set(i);
bit[3][5] = 1 说明第5个集合有3这个数.
}
}
int q; scanf("%d",&q);
for(int i = 0 ;i < q; i++)
{
int x, y; scanf("%d%d",&x,&y);
if((bit[x]&bit[y]).count()!=0)//(bit[x]&bit[y])也还是一个bitset
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}