BitSet的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BitSet的使用相关的知识,希望对你有一定的参考价值。

有些程序须要处理二进制有序集,标准库提供了bitset 类型,其实,bitset 是一个二进制容器。容器中每个元素都是一位二进制码,或为 0,或为 1。

bitset除了能够訪问指定下标的bit位以外。还能够把它们作为一个整数来进行某些统计。

1、定义与初始化

使用:

#include <bitset>

using std::bitset;

在定义 bitset 时,要明白 bitset 有多少位。这个位数是整型常量:

bitset<n> b;       //b 有 n 位,每位都是 0

bitset<n> b(u);    //b 是 unsigned long 型 u 的一个副本

bitset<n> b(s);    //b 是 string 对象 s 中含有的位串的副本,这个s 必须是位串,也就是二进制码串

bitset<n> b(s, pos, n); //b 是 s 中 从位置 pos 開始的 n 个位的副本。

2bitset操作

用整值类型表示位向量的问题在于使用位操作符来设置复位和測试单独的位层次比較低也比較复杂.

比如用整值类型将第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

以下的bitvec3 的定义

bitset< 32 > bitvec3( 012 );

将第1 和3 位的值设置为1 如果位置从0 开0

我们还能够传递一个代表0 和1 的集合的字符串參数来构造bitset 对象例如以下所看到的

// 与bitvec3 的初始化等价

string bitval( "1010" );

bitset< 32 > bitvec4( bitval );

bitvec4 和bitvec3 的第1 和3 位都被设置为1 而其它位保持为0

bitvec.set();

3、相关函数

b.any()          //b 中是否存在置为 1 的二进制位? 

b.none()         // 和b.any() 效果一样

b.count()        //b 中不存在置为 1 的二进制位吗? 

b.size()         //b 中置为 1 的二进制位的个数 

b[pos]           //訪问 b 中在 pos 处二进制位 

b.test(pos)      //b 中在 pos 处的二进制位置为 1 

b.set()          // 把 b 中全部二进制位都置为 1

b.set(pos)       //把 b 中在 pos 处的二进制位置为 1 

b.reset()        //把 b 中全部二进制位都置为 0 

b.reset(pos)     //把 b 中在 pos 处的二进制位置为 0 

b.flip()         //把 b 中全部二进制位逐位取反 

b.flip(pos)      //把 b 中在 pos 处的二进制位取反 

b.to_ulong()     //用 b 中相同的二进制位返回一个 unsigned long 值 

os << b          //把 b 中的位集输出到 os 流


实验代码及执行结果:

#include "stdafx.h"
#include <iostream>
#include <bitset>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

	//bitset的全部操作:
	//any();none();test();bit[];set();reset();to_string();to_ulong();
	//count();flip();分别用十进制。八进制,十六进制。字符串赋值。

	bitset<32> bitvec(8);//0~31,将数字8转为2进制形式存储。0001000000....
	bool flag = bitvec.any();//推断是否存在某位或者多位为1,有则返回true
	bool flag1 = bitvec.none();//推断是否全部的位都是0,是则返回true
	bool flag2 = bitvec.test(3);//測试第4位是否为1。是则返回true<<
	cout<<"bitvec的值为:"<<bitvec<<endl;
	cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
	bitvec.reset(3);//将第4位设置为0,或者bitvec[3] = 0
	cout<<"bitvec.reset(3)之后第4位为:"<<bitvec[3]<<endl;//输出第4位的值
	bitvec.reset();//将全部位设置为0
	cout<<"bitvec.reset()之后bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.set();//将全部位设置为1
	cout<<"bitvec.set()之后bitvec.to_string()的值为:"<<bitvec.to_string()<<endl;
	cout<<"bitvec的值为:"<<bitvec<<endl;
	cout<<"bitvec.to_ulong()的值为:"<<bitvec.to_ulong()<<endl;
	cout<<"bitvec中1的个数为:"<<bitvec.count()<<endl;
	bitvec = 8;
	cout<<"bitvec = 8之后bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.flip();//将全部的位翻转
	cout<<"bitvec.flip()之后bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec.flip(0);//翻转第一位
	cout<<"bitvec.flip(0)之后bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec = 0xffff;//设置低16位为1
	cout<<"bitvec = 0xffff之后bitvec的值为:"<<bitvec.to_string()<<endl;
	bitvec = 012;//用八进制值012设置bitvec,数字前加0表示为8进制!

!!

cout<<"bitvec = 012之后bitvec的值为:"<<bitvec.to_string()<<endl; string bit = "1011"; bitset<32> bitvec1(bit);//用字符串对象初始化bitset<32>对象 cout<<"bitvec1的值为:"<<bitvec1.to_string()<<endl; string bit1 = "1111110101100011010101"; bitset<32> bitvec2(bit1,6);//用从第6位開始到字符串结束这一部分初始化bitvec2 cout<<"bitvec2的值为:"<<bitvec2.to_string()<<endl; bitset<32> bitvec3(bit1,6,4);//用从第6位開始。长度为4这一部分初始化bitvec3; cout<<"bitvec3的值为:"<<bitvec3.to_string()<<endl; getchar(); return 0; }

技术分享

以上是关于BitSet的使用的主要内容,如果未能解决你的问题,请参考以下文章

在初始化时定义位集大小?

Bitset学习

STL详解(十四)—— bitset(位图)的介绍与使用

BitSet 的使用

2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0

bitset简易使用方法