位字段(Bit Field)讨论
位字段以结构体形式声明,结构体为每个字段声明标签,并定义宽度。如下
struct BitFileds
{
unsigned int a :2;
unsigned int b :4;
unsigned int :2;
unsigned int c :8;
};
a,b,c分别占据2,4,8位宽度,中间还有一个匿名字段,占2个位。按常规结构体定义该结构占据4个int大小,实际上它只占1个int大小。
下面是查看位字段内存布局的实例。(位字段是与硬件相关的,不同系统可能得到不同的结果,如本例中a在低位,而其他系统中a可能在高位。)
#include "stdio.h"
typedef struct
{
unsigned short a :2;
unsigned short b :4;
unsigned short c :8;
unsigned short :0; // 0占位项,可以显式将d放入下一个unsigned short中
unsigned short d :3;
unsigned short e :13;
} BitFileds;
typedef union
{
BitFileds bf;
int ui;
} un_BitField;
void itobs(int n, char* bs);
void showresult(const char* str);
void main()
{
BitFileds bf;
un_BitField un_bf;
bf.a = 1;
bf.b = 1;
bf.c = 1;
bf.d = 5;
bf.e = 0;
un_bf.bf = bf;
char bs[8*sizeof(int) + 1];
itobs((int)un_bf.ui, bs);
showresult(bs);
}
//将整形数转化为二进制字符串
void itobs(int n, char* bs)
{
int len = 8 * sizeof(int);
for (int k = len - 1;k >= 0;k--,n>>=1)
{
bs[k] = (0x01&n) + '0';
}
bs[len] = '\0';
}
//显示二进制字符串
void showresult(const char* str)
{
int i = 0;
while (str[i])
{
putchar(str[i]);
if (++i%4 == 0 && str[i])
{
putchar(' ');
}
}
putchar('\n');
}
结果: