STL之bitset

爱⌒轻易说出口 提交于 2020-03-10 20:27:02

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
    4char 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
    3char 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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!