C++学习第八天:bitset类

/*
	bitset类型:标准库中处理位集的类。
		
	初始化bitset对象的方法,其中n是代表几位位数:
		bitset<n> b;			b有n位,每一位都是0
		bitset<n> b(u);			b是unsigned long型u的一个副本
		bitset<n> b(s);			b是字符串对象s中含有的位串的副本
		bitset<n> b(s,pos,n);	b是s中从位置pos开始的n个位的副本

	在使用unsigned值初始化bitset对象时,将白值转化为二进制值,如果该值的二进制位超过bitset对象的最高位,则超出部分将被丢弃,如果该值的最高位大于bitset对象的最高位,则超出部分将置为0.例如:
	(0xffff在32为中unsigned值中表示二进制位就是十六个1和十六个0,使用0xffff初始化bitset对象)
			bitset<16> b1(0xffff);          //0~15位置为1,0xffff多出部分被抛弃
			bitset<32> b2<0xffff);			//0~15位置为1,16~31位置为0,刚好保存0xffff的值
			bitset<128> b3<0xffff);			//0~31为0xffff的二进制位值,超部出分置为0

	使用string对象初始化bitset对象:string对象和bitset对象之间是反向转化的:string对象的最右边字符用来初始化bitset的低阶位, 即string对象的下标值最大的那个字符作为bitset对象的下标值最小的位。例如:
			string str("1100");
			bitset<32> b4(str);       //则bitset对象b4为:00110000000..........
			
	bitset对象的操作:
		b.any()				判断存在1
		b.none()			判断不存在其
		b.count()			计算1的个数
		b.size()			计算二进制的个数
		b[pos]				访问下标为pos的二进制位
		b.test(pos)			判断下标为pos的位是否为1
		b.set()				把bitset对象全部置为1
		b.set(pos)			把pos下标的二进制位置为1
		b.reset()			全部置为0
		b.reset(pos)		把小表pos的二进制位置为0
		b.flip()			全部取反
		b.flip(pos)			下标为pos的二进制位取反
		b.to_ulong()		把b中同样的二进制位返回一个unsigned long值
		os<<b				把b中的位集输出到os流
		例:
			size_t bits_set=b.cout();
			
			//count操作返回类型是标准库中命名为size_t的类型,size_t类型定义在cstddef头文件中,
			 //它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小
		

*/
int main(){
	
	bitset<5> b1(0xffff);   //0xffff比bitset位数大,超出部分直接丢弃
	cout<<b1<<endl;
	//刚刚好存下整个值
	bitset<32> b2(0xffff);   
	cout<<b2<<endl;
	 //bitset对象位数大于整数值
	bitset<128> b3(0xffff);   
	cout<<b3<<endl;
	//使用字符串初始化bitset对象,测试是否是反向转化的。
	string strval("1100");
	bitset<4> b(strval);
	cout<<b<<endl;
	
	cout<<"是否有1"<<b.any()<<endl;//			判断存在1
	cout<<"是否有0"<<b.none()<<endl;//		判断不存在其
	size_t t=b.count()	;//		计算1的个数,返回size_t类型
	cout<<"1的个数是:"<<t<<endl;
	size_t t2=b.size()	;//		计算二进制的个数,返回size_t类型
	cout<<"二进制的个数:"<<t2<<endl;
	int pos=1;
	cout<<"下标为1的位"<<b[pos]<<endl;	//访问下标为pos的二进制位
	cout<<"测试下标为1的位是否为1"<<b.test(pos)<<endl	;//		判断下标为pos的位是否为1
	b.set()		;//		把bitset对象全部置为1
	cout<<"全部修改为1"<<b<<endl;
	b.reset()	;//		全部置为0
	cout<<"全部修改为0"<<b<<endl;
	b.set(pos)	;//		把pos下标的二进制位置为1
	cout<<"下标为1的位修改为1"<<b<<endl;
	b.reset(pos);//		把小表pos的二进制位置为0
	cout<<"下标为1的为修改为0"<<b<<endl;
	b.flip()	;//		全部取反
	cout<<"取反"<<b<<endl;
	b.flip(pos)	;//		下标为pos的二进制位取反
	cout<<"下标为1的位取反"<<b<<endl;
	cout<<"unsigned long类型的值"<<b.to_ulong()<<endl;// 把b中同样的二进制位返回一个unsigned long值 


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值