C++ Bitset (位集合)
C++ Bitsets给程序员提供一种位集合的数据结构。Bitsets使用许多二元操作符,比如逻辑和,或等。bitset类模板支持有效的的固定大小位设置操作,vector模板规范支持动态大小的位字符串。
函数列表:
Constructors 创建新bitsets
Operators 比较和赋值bitsets
any() 如果有任何一个位被设置就返回true
count() 返回被设置的位的个数
flip() 反转bits中的位
none() 如果没有位被设置则返回true
reset() 清空所有位
set() 设置位
size() 返回可以容纳的位的个数
test() 返回指定位的状态
to_string() 返回bitset的字符串表示
to_ulong() 返回bitset的整数表示
/////////////////////////////////////////////////////////////////////////////////////
Constructors
语法:
bitset();
bitset(unsigned long val);
explicit bitset(const string& str,
size_t pos = 0, size_t n = -1);
1.C++ Bitsets能以无参的形式创建.
2.用一个长无符号整数,它将被转化为二进制(若val<0,虽会被转化为补码形式,但编译器会把它看做某个长无符号整数的真值),然后插入到bitset中。当创建bitset时,模板中提供的数字决定bitset有多长。
3.用一个二进制位字符串以pos为起始点的n个位字符初始化bitset对象。当n=-1时,初始化的位字符个数为strlen(str).若strlen(str)>bitset的固定大小,str将被截断。
示例:
#include<iostream>
#include<bitset>
using namespace std;
void main()
{
bitset<8> bs;
// 显示这个bitset
for( int i = (int) bs.size()-1; i >= 0; i-- ) {
cout<<bs[i]<< " ";
}
cout<<endl;
// 创建另一个bitset
bitset<8> bs2( (long) 131 );
// 显示
for( int j = (int) bs2.size()-1; j >= 0; j-- ) {
cout << bs2[j] << " ";
}
cout<<endl;
bitset<8>bs3("1001010",0,strlen("1001010"));//位串
for( int k = (int) bs3.size()-1; k >= 0; k-- )
{
cout << bs3.at(k) << " ";
}
cout<<endl;
}
输出结果:
0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 1
0 1 0 0 1 0 1 0
Operators
语法:
!=, ==, &=, ^=, |=, ~, <<=, >>=, []
这些操作符都可以和bitsets一起工作。它们被这样定义:
!= 如果两个bitset不相等,返回真。
== 如果两个bitset相等,返回真。
&= 完成两个bitset间的与运算。
^= 完成两个bitset间的异或运算。
|= 完成两个bitset间的或运算。
~ 反置bitset (和调用 flip()类似)
<<= 把bitset向左移动
>>= 把bitset向右移动
[x] 返回第x个位的引用
示例:
// 创建一个bitset
bitset<8> bs( (long) 131 );
cout << "bs is " << bs2 << endl;
// 向左移动4位
bs <<= 4;
cout << "now bs is " << bs << endl;
bs >>= 4;
cout << "now bs is " << bs << endl;
当上述代码运行时,显示:
bs2 is 01110001
now bs2 is 00010000
now bs2 is 00000001
bool any();
any()如果有位被设置为1,函数返回真,否则返回假
size_type count();
count()函数bitset中被设置成1的位的个数。
bitset &flip();
bitset &flip( size_t pos );
flip()函数反置bitset中所有的位,即将1设为0,0设为1。如果指定pos,那么只有pos上的位被反置
bool none() const;
none()如果没有位被设为1,返回真;否则返回假。
bitset &set();
bitset &set( size_t pos, int val=1 );
set()函数重新设置bitset上所有的位(各位全清为1),然后返回bitset。如果指定pos,那么只有pos(最低位为0位)上的位被设置。
size_t size();
size()返回bitset能容纳的位。
bool test( size_t pos );
test()函数返回在pos上的位的值。
示例:
bitset<8> bs2( (long)6 );
cout << bs2.test(1) << endl;
输出:1
string to_string();
to_string()函数返回bitset的字符串形式。
unsigned long to_ulong();
to_ulong()返回bitset的无符号长整数形式。
示例:
bitset<8> bs1( (long)6 );
cout << bs1.to_string() << endl;
cout << bs1.to_ulong() << endl;
输出结果:
00000110
6