C和C++中的bitset

前言

  C语言中没有bool类型,通常会使用整形值表示bool类型,占内存较多。C++中有bool且推出了bitset类库来,可以使用一个bit位来表示一个数据的bool类型,本文将有所介绍。
  另外在C语言中借助字符数组或整形值数组,同样可自己表示出bitset的机制。


一. C++中的bitset简述
1.1 头文件

  bitset是C++中的一个类库,它可以管理到具体的每一个bit位,但又能存储一个具体的整型值或者字符串。其有很多成员函数能够很容易的获取到我们想要的内容。
  其中管理bit位可能是我们想要的重点内容。

#include <bitset>
1.2 声明定义
bitset<4> a;			//声明一个长度为4bit的 bitset,默认每一位为 0.
bitset<8> b(12);		//声明一个长度为8bit的 bitset,存储数值12,内容为 0000 1100.
string s = "101100"	 	//bitset保存字符串时,字符串的内容只能包含 0 和 1.
bitset<8> c(s);			//声明一个长度为 8bit的bitset,存储字符串s,内容为 0010 1100.

【PS】

  1. 用字符串构造时,字符串只能包含01.
  2. 在进行有参构造时,若参数所需空间比bitset的空间小,则在前面补0.
  3. 在进行有参构造时,若参数所需空间比bitset的空间大,参数为整数时取后面部分,参数为字符串时取前面部分.
1.2 成员函数和使用方法
bitset<24> s(128);

//获取函数
s.count();			//返回s中1的个数
s.size();			//返回s的空间大小
s.test(2);			//检查下标为2的元素是否为1,1返回true, 0返回false
s.any();			//检查s中是否有1
s.none();			//检查s中是否没有1
s.all();			//检查s中是否全为1

//设置函数
s.flip();			//不传参则将s的每一位取反
s.flip(2);			//传参则将下标为2的位取反
s.set();			//不传参则将全部位数置1
s.set(3);			//传参则将下标为3的位数置1
s.set(3,0);			//传两个参数则将s的下标为3的位数置为0(第二个参数)
s.reset();			//不传参则将s的每一位置0
s.reset(3);			//传参则将下标为3的位数置为0
1.3 转换函数
bitset<8> t("11001001");

string s = t.to_string();
unsigned long a = t.to_ulong();
unsigned long long b = t.to_ullong(); 
二、C语言基于数组实现bitset
2.1 逻辑思路
2.2 实现方法
//bitset类型声明
#define MAX_BIT_FLAG_SIZE  128
typedef  char bitset[MAX_BIT_FLAG_SIZE/8 + 8];

//bit枚举值定义
enum ReqDataEnum
{
	RQE_BIT_NUM1;
	REQ_BIT_NUM2;
	REQ_BIT_NUM3;
	REQ_BIT_NUM4;
	REQ_BIT_NUM5;
	...
	MAX_REQ_BIT = 127;
};

//设置和获取 bit位数值宏函数
#define ST_SET(bitset, index)		(bitset[(index)/8] |= (1UL<<((index)%8)))  //此处为a=a|b,不是异或
#define ST_CLEAR(bitset, index)		(bitset[(index)/8] &= ~(1UL<<((index)%8))) //
#define ST_IS_SET(bitset, index)	(bitset[(index)/8] &  (1UL<<((index)%8)))  //此处返回整形值
#define ST_IS_SET_RET_BOOL(bitset, index)	( ((bitset[(index)/8] & (1UL<<((index)%8)))) >>((index)%8))  //此处返回BOOL值


//实际运用 bit集合位
typedef struct
{
	int num1;
	int num2;
	int num3;
	char num4;
	char num5;
	bitset st;
}SessionData;

SessionData user1;
ST_SET(user1.st, RQE_BIT_NUM1);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值