C/C++中没有bool类型,使用整形值表示bool类型占内存较多。C++中推出了bitset类库来,可以使用一个bit位来表示一个数据的bool类型,本文将有所介绍。
另外在C语言中借助字符数组或整形值数组,同样可自己表示出bitset的机制。
bitset是C++中的一个类库,它可以管理到具体的每一个bit位,但又能存储一个具体的整型值或者字符串。其有很多成员函数能够很容易的获取到我们想要的内容。
其中管理bit位可能是我们想要的重点内容。
#include
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】
0和1.bitset的空间小,则在前面补0.bitset的空间大,参数为整数时取后面部分,参数为字符串时取前面部分.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
bitset<8> t("11001001");string s = t.to_string();
unsigned long a = t.to_ulong();
unsigned long long b = t.to_ullong();
//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);