前言
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】
- 用字符串构造时,字符串只能包含
0
和1
. - 在进行有参构造时,若参数所需空间比
bitset
的空间小,则在前面补0. - 在进行有参构造时,若参数所需空间比
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);