C++中的bitset

bitset

C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。
bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。
可以如下声明一个该类型变量:
bitset<N>varm (M)
其中varm为变量名。
N表示该类型在内存中占的位数,是二进制。

M表示变量varm的初始值。


bitset操作

用整值类型表示位向量的问题在于使用位操作符来设置复位和测试单独的位层次比较低也比较复杂.
例如用整值类型将第27 位设置为1, 我们这样写 quiz1 |= 1<<27;
而用bitset 来做我们可以写 quizl[ 27 ] = 1; 或 quiz1.set( 27 );
要使用bitset 类我们必须包含相关的头文件
#include <bitset>


bitset 有三种声明方式在缺省定义中我们只需简单地指明位向量的长度例如
bitset< 32 > bitvec;声明了一个含有32 个位的bitset 对象位的顺序从0 到31 缺省情况下所有的位都被
初始化为0 

为了测试bitset 对象是否含有被设置为1 的位我们可以使用any()操作当bitset 对象的一位或多个位被设置为1 时any()返回true 对于bitvec .如下测试
bool is_set = bitvec.any();
它的结果当然是false 相反如果bitset 对象的所有位都被设置为0 ,则none()操作返回 true 

对于bitvec 测试
bool is_not_set = bitvec.none();
结果为true 

count()操作返回被设置为1 的位的个数.
int bits_set = bitvec.count();
我们可以用set()操作或者下标操作符来设置某个单独的位例如下面的for 循环把偶数位设置为1.
for ( int index = 0; index < 32; ++ index )
    if ( index % 2 == 0 )
        bitvec[ index ] = 1;

类似地测试某个单独的位是否为1 也有两种方式test()操作用位置做参数返回true 或false 例如
if ( bitvec.test( 0 ))
// 我们的bitve[0] 可以工作了!
同样地我们也可以用下标操作符
cout << "bitvec: positions turned on:\n\t";
for ( int index = 0; index < 32; ++index )
    if ( bitvec[ index ] )
         cout << index << " ";
   cout << endl;
要将某个单独的位设置为0 ,我们可以用reset()或下标操作符下列两个操作都将bitvec的第一位设为0.
// 两者等价都把第一位设置为0
bitvec.reset( 0 );
bitvec[ 0 ] = 0;
我们也可以用set()和reset()操作将整个bitset 对象的所有位设为1 或0 ,只要调用相应的操作而不必传递位置参数我们就可以做到这一点.例如
// 把所有的位设置为0
bitvec.reset();
if ( bitvec.none() != true )
// 喔! 错了
// 把所有的位设置为1if ( bitvec.any() != true )
// 喔! 又错了
flip()操作翻转整个bitset 对象或一个独立的位
bitvec.flip( 0 ); // 翻转第一位
bitvec[0].flip(); // 也是翻转第一位
bitvec.flip(); // 翻转所有的位的值

还有两种方法可以构造bitset 对象它们都提供了将某位初始化为1 的方式:一种方法是为构造函数显式地提供一个无符号参数bitset 对象的前N 位被初始化为参数的相应位值,例如
bitset< 32 > bitvec2( 0xffff );
将bitvec2 的低16 位设为1
00000000000000001111111111111111
下面的bitvec3 的定义
bitset< 32 > bitvec3( 012 );
将第1 和3 位的值设置为1 假设位置从0 开始计数
00000000000000000000000000001010
我们还可以传递一个代表0 和1 的集合的字符串参数来构造bitset 对象如下所示
// 与bitvec3 的初始化等价
string bitval( "1010" );
bitset< 32 > bitvec4( bitval );
bitvec4 和bitvec3 的第1 和3 位都被设置为1 而其他位保持为0
bitvec.set();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章