C++-031-bitset模板

C+±031-bitset模板-2020-3-12
在编程中经常会开辟一个数组作为标志位使用,所谓标志位处理就是说某一件事件可能发送或不发生,有两个状态(C/C++里用1和0来表示)。而类似的事件有很多,并且都相互独立。这种情况标志位是最好的解决方案。在C/C++里通常会使用布尔(bool)数组,布尔型的字节长度为1,共8位,一个布尔型变量只能表示一个标志位,但如果直接用位进行操作的话,一个布尔型变量的字节长度可以存储8个标志位。这无疑极大地降低了程序地空间复杂度。但是程序复杂度却直线上升。一般解决方法可以是使用bitset模板或者是位段。
C++提供了C++标准库bitset,可以像使用普通数组一样轻松地进行位操作了。
bitset是STL的一部分,准确地说,bitset是一个模板类,bitset使用之前必须要包含<bitset>头文件。
下面将介绍bitset中常用的几种函数。
构造函数1:bitset<n>b;
b有n位,每位都为0,参数n可以为一个表达式。
如bitset<5>barray;则barray位数组为"00000"。

//构造函数1
#include<iostream>
#include<bitset>//必须引入该头文件
using namespace std;//全局位数组512M内存环境下数组大小可开到5000万以上
int main()
{
	bitset<5000000>bin;//bin为位数组,初始为0,一般512M内存上限约为500万
	bin[0]=1; //设为1
	bin[1]=true;
	bin[2]=0;  //设为0 
	bin[3]=false; 
	cout<<bin[0]<<bin[1]<<bin[3]<<bin[4];//打印出11000
	return 0; 
} 
1100
--------------------------------
Process exited with return value 0
Press any key to continue . . .

构造函数2:bitset<n>b(unsigned long u);
如:bitset<5>b(5);则b为"10100"。
b有n位,并用u赋值;如果u超过n位,则顶端被截除。

//构造函数2
#include<iostream>
#include<bitset>
using namespace std;//全局位数组512M内存环境下数组大小可开到5000万以上
int main()
{
    bitset<5> bin(5);//从左向右赋值
	for(int i=0;i<=4;i++)
	cout<<bin[i];//打印出10100 
	return 0; 
} 
10100
--------------------------------
Process exited with return value 0
Press any key to continue . . .

构造函数3:bitset<n>b(string s);
b是string对象s中含有的位串的副本。

string bitval("10011");
bitset<5>aru (bitval4);

则:“ary"为"11001”。

//构造函数3
#include<iostream>
#include<bitset>
using namespace std;//全局位数组512M内存环境下数组大小可开到5000万以上
int main()
{
    string temp="10101111100";
	bitset<10> bin(temp);
	for(int i=0;i<=9;i++)
	cout<<bin[i];//打印出0011110101注意,是从左向右依次填入的 
	return 0; 
} 
0111110101
--------------------------------
Process exited with return value 0
Press any key to continue . . .

构造函数4:bitset<n>ary(s,pos);
ary是s中从位置pos开始位的副本,后面的多余位自动填充0.

//构造函数4
#include<iostream>
#include<bitset>
using namespace std;//全局位数组512M内存环境下数组大小可开到5000万以上
int main()
{
    string temp="1010111101";
    bitset<10>bin(temp,4);//从第4位开始取值,包括第0位
	for(int i=0;i<=9;i++)
	cout<<bin[i];//打印出1011110000,注意,是从左向右依次填入的 
    return 0; 
} 
1011110000
--------------------------------
Process exited with return value 0
Press any key to continue . . .

构造函数5:bitset<n>b(s,pos,num);
b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0.

//构造函数5
#include<iostream>
#include<bitset>
using namespace std;//全局位数组512M内存环境下数组大小可开到5000万以上
int main()
{
    string temp="1010111101";
    bitset<10>bin(temp,4,5);//从第4位开始往后取5个元素取余填作0 
	for(int i=0;i<=9;i++)
	cout<<bin[i];//打印出1011110000,注意,是从左向右依次填入的 
    return 0; 
} 
0111100000
--------------------------------
Process exited with return value 0
Press any key to continue . . .

其他函数的用法见下面的程序及注释:

/*
bitset模板其他函数的用法总汇
*/
#include<iostream>
#include<bitset>
using namespace std;
string temp="1010111101";
bitset<10>bin(temp);
void out()
{
	for(int i=0;i<=9;i++)
	cout<<bin[i];
	cout<<endl;
} 
int main()
{
	out();;
	cout<<endl<<bin.any()<<endl;//是否存在置为1的位数
	cout<<bin.none()<<endl;//是否全部为0,与any()相反
	cout<<bin.count()<<endl;//二进制为1的个数
	cout<<bin.size()<<endl;//总长度
	bin.flip();//二进制位依次取反
	out();
	bin.flip(0);//第零位取反
	out();
	cout<<bin.operator[](2)<<endl;//获取第2位的值
	bin.set();//将所有位全置为1
	out();
	bin.reset();//将所有位全置为0
	out();
	bin.set(0);//将0位置为1
	out();
	bin.reset(0);//将0位置为0
	out();
	cout<<bin.test(0)<<endl;//判断第0位是否为1
	bin.set(0);
	int x=bin.to_ulong();//转为整数1.注意从右向左取值及长度勿超过long型范围
	cout<<x<<endl;
	return 0; 
}
1011110101

1
0
7
10
0100001010
1100001010
0
1111111111
0000000000
1000000000
0000000000
0
1

--------------------------------
Process exited with return value 0
Press any key to continue . . .
发布了91 篇原创文章 · 获赞 101 · 访问量 3286

猜你喜欢

转载自blog.csdn.net/weixin_41096569/article/details/104818970