3
11
2016
0

stl::bitset基本操作

bitset 相当于一维bool数组,对于二进制操作十分方便。

除了可以访问指定下标的bit位以外,还可以把它们作为一个整数进行统计。

基本操作:

 

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
const int N=1000;
int main()
{
	bitset<N> a;
	
	//赋值为真 
	a[100]=1;
	a.set(1);
	
	//访问该位是否为真
	cout<<a.test(99)<<endl;
	cout<<a.test(100)<<endl;
	cout<<a[1]<<endl;
	cout<<a[2]<<endl;
	puts("—————"); 
	
	//是否非空\全空\全满
	cout<<a.any()<<endl;
	cout<<a.none()<<endl;
	cout<<a.all()<<endl;
	puts("—————");	 
	
	//计数值为真的个数 
	cout<<a.count()<<endl;
	//返回位元素个数 
	cout<<a.size()<<endl;
	puts("—————"); 
	
	//清空
	a.reset();
	cout<<a.count()<<endl;
	cout<<a.none()<<endl;
	puts("—————"); 
	
	//反置---将0/1互换 
	a.flip();
	cout<<a.count()<<endl;
	cout<<a.all()<<endl;
	
	return 0;
}

上述代码输出结果:


6/8 UPD:

复习了一下,重新写了一个程序。嗯..表示上面的代码可以不用看了。

#include<iostream>
#include<bitset>
using namespace std;
const int N=100;
int main()
{
	//声明(下标为0~99) 
	bitset<N> a;
	
	int val=22;
	bitset<4> b(val);//★val超过4位,顶端被截除 
	
	string s("100011");
	bitset<5> c(s);//★s超过5位,末尾被截除 
	
	//赋值
	a[98]=1;//访问特定位
	b.set(2);//将特定位置1
	c.reset(3);//将特定位置0
	
	//查询1
	cout<<a.test(2)<<endl;//某位是否为真 
	cout<<a.test(98)<<endl;
	
	val=b.to_ulong();//重新得到val的值 
	cout<<"val="<<val<<endl;
	
	for(int i=0;i<5;i++) cout<<c[i];cout<<endl;//整体输出
	
	//清空与反置
	a.flip(98);//特定位反置(0/1互换) 
	puts(a.none()?"没有位为1":"存在位为1"); 
	 
	b.reset();//所有位置0 
	puts(b.any()?"有任意位为1":"没有任何位为1");
	
	c.set();//所有位置1 
	puts(c.all()?"所有位均为1":"不是所有位均为1"); 
	
	//查询2
	cout<<b.size()<<endl;//位元素的个数
	cout<<c.count()<<endl;//值为1的位的个数 
	return 0;	
}

输出结果:

两个bitset的合并:

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
int main()
{
	string s1("1111"),s2("0000");
	bitset<4> bits1(s1);
	bitset<4> bits2(s2);
	
	int s=bits1.size()+bits2.size();
	
	bitset<10> bits3;//注意:不可以实用动态参数作为模板参数,如bitset<s> bits3
	
	for(int i=0;i<bits1.size();i++)
		if(bits1[i]==1) bits3.set(i);
	
	for(int i=bits1.size();i<s;i++)
		if(bits2[i-bits1.size()]==1) bits3.set(i);
		
	cout<<bits3<<endl<<bits3.to_ulong()<<endl;
	printf("%d",bits3.to_ulong());//相当于cout<<bits.to_ulong(); 
	return 0;
}

注意:

1、bits.to_ulong(),是.to_ulong,.to_ulong()!!!

(unsigned long)

2、string s("1111");bitset<4> bits(s);
与 bitset<4> bits(1111);是不同的!
而bitset<4> bits("1111");的写法是错误的!

Category: STL | Tags: STL 黑科技 | Read Count: 982

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com