本文共 1292 字,大约阅读时间需要 4 分钟。
C语言中的位域结构体
一、什么是位域结构体?
在数据表达的过程中,有的时候我们并不需要一个完整的字节来表示,例如在表示二逻辑状态数据的时候我们只需要一个二进制位(0、1)就能够很好的表达出来。同样的出于节省空间或者精简数据,减小数据大小,以提高数据传输速度等因素的考虑,C语言提供了一种称为位域(位段)的数据结构。在位域(位段)结构中,把一个字节中的二进位划分为几多个不同的区域,并对每个区域的位数加以说明(即给每个域提供一个域名,也可缺省),使得在程序中可以按域名对数据进行操作。
二、位域结构体如何定义?
位域(位段)定义的格式与结构体的定义格式相类似:
struct 位域结构名 { 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct { unsigned int: 1; // bit_0 位域名缺省, 无名位域 unsigned int bit_1 : 1; // bit_ 位定义域名为 bit_1 unsigned int bit_2 : 1; unsigned int bit_3 : 2; unsigned int bit_5 : 1; unsigned int bit_6 : 1; unsigned int bit_7 : 1; } OneByte; // 一个字节共8位
三、定义位域结构体时需要注意的问题
1、一个位域必须存储在同一个字节中,不能跨两个字节存储。如果一个字节所剩空间不够存放另一位域时,剩余的空间应该使用空域填充或无名位域填充,声明不使用,然后从下一单元开始存放这个位域。例如:
struct { unsigned a:4 unsigned :0 /*空域,用于填充,声明本字节中剩余位不使用(空穴)*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 }TowByte;
2、一个位域的长度不能大于一个int的长度(32bit位)
3、一个位域可以不定义位域名,但此时它只能用来作填充或调整位置。无名位域是不能在程序中使用的。
四、位域变量的使用
位域变量的使用方式和结构成员的使用方式相同,其使用格式为:位域变量名·位域名 位域变量指针->位域名而且位域变量是允许使用各种格式输出的。例如:
OneByte b_Byte, *p_Byte;b_Byte.bit_2= 0;p_Byte->bit_3= 1;b_Byte.bit_5= 1;p_Byte->bit_6= 0;p_Byte->bit_7= 1;printf("%d,%d,%d\n", b_Byte.bit_2, p_Byte->bit_3, b_Byte.bit_5, p_Byte->bit_6, p_Byte->bit_7);p_Byte->bit_3 &= 0;p_Byte->bit_5 |= 0;printf("%d,%d\n",p_Byte->bit_3, b_Byte.bit_5);
转载地址:http://lmmsi.baihongyu.com/