C++ bitset使用指南
介绍:C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。
bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。方便储存bool结果 做数字压缩。(来自百度百科)
声明:
bitset< size> varm(M)
其中varm为变量名。
size表示该类型在内存中占的位数,是二进制。
M表示变量varm的初始值。
1、bitset<4> bitset1; //无参构造,长度为4,默认每一位为0 //0000
2、bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充 //00001100
3、string s = "100101";
bitset<10> bitset3(s); //长度为10,前面用0补充 //0000100101
4、char s2[] = "10101";
bitset<13> bitset4(s2); //长度为13,前面用0补充 //0000000010101
5、bitset<10> bitset5("11111"); // C++ 11 语法 //0000011111
注意: 声明时若参数长度比size大,参数为整型时取后面部分,参数为字符串时取前面部分。
例如:
1、bitset<2> bitset1(12); //12的二进制为1100,而size=2,只取后面部分,即00
2、string s = "100101";
bitset<4> bitset2(s); //s长度为6,而size=4,只取前面部分,即1001
3、char s2[] = "11101";
bitset<4> bitset3(s2); //只取前面4位,即1110
访问:
bitset 变量可以通过[ ] 访问元素,但注意与数组访问不同的是它的最低位下标为0(从右往左依次增加)。通常结合位运算使用:&、| 、~、<<、>>、^ 等。(整体运算)
string s="0111";
bitset<4> t (s);
cout<<t[0]<<endl; // 1
t<<=1;
cout<<t<<endl; // 输出1110 t里的 1整体左移,低位补零,高位丢失;
成员函数:
b.set() 把b中所有二进制位的值为1
b.set(pos) 把b中下标为pos的二进制位值为1
b.reset() 把b中所有二进制位的值为0
b.reset(pos) 把b中下标为pos的二进制位值为0
b.flip() 把b中所有二进制位逐位取反
b.flip(pos) 把b中下标为pos的二进制位取反
b.count() b中值为1的二进制位的个数
b.test(pos) b中在pos处的二进制位是否为1
bitset<10> f ("0010011011"); // C++ 11 语法
string s = f.to_string(); // 将bitset转换成string类型 0010011011
unsigned long a = f.to_ulong(); //将bitset转换成unsigned long类型 155
unsigned long long b = f.to_ullong(); //将bitset转换成unsigned long long类型 155 (注:C++ 11 )
入门题:
牛客练习赛22 C 简单瞎搞题
题意:n个区间,每个区间出找一个数然后平方,求这n个数之和有多少种。
在这里bitset 中第 i 位上是否为1 代表 大小为 i 的这个数是否能由之前的数求和得到(妙啊)。
#include<iostream>
#include<bitset>
using namespace std;
const int N = 1e6+7;
bitset<N> t, ans; //由于最大的数不超过1e6 ,所以开大小为N;
int main()
{
int n,l,r;
cin>>n;
ans[0] = 1; //初始 1 ,之后的每一个1都是由它左移得来;
while(n--){
scanf("%d%d",&l,&r);
t.reset();
for(int i=l;i <= r; i++){
t |= ans<<(i*i); // 含义:动态前缀和 + 去重 // ans<<(i*i) 代表ans中的每一个1都左移i*i位
}
ans = t;
}
cout<<ans.count()<<endl;
return 0;
}
来源:CSDN
作者:consult_
链接:https://blog.csdn.net/weixin_44851176/article/details/104762839