C语言小碎片七

来源:互联网 发布:java io读取文件 编辑:程序博客网 时间:2024/04/30 14:07

C语言中的位域结构体


一、什么是位域结构体?

    在数据表达的过程中,有的时候我们并不需要一个完整的字节来表示,例如在表示二逻辑状态数据的时候我们只需要一个二进制位(0、1)就能够很好的表达出来。同样的出于节省空间或者精简数据,减小数据大小,以提高数据传输速度等因素的考虑,C语言提供了一种称为位域(位段)的数据结构。在位域(位段)结构中,把一个字节中的二进位划分为几多个不同的区域,并对每个区域的位数加以说明(即给每个域提供一个域名,也可缺省),使得在程序中可以按域名对数据进行操作。

 

二、位域结构体如何定义?

    位域(位段)定义的格式与结构体的定义格式相类似:

struct 位域结构名   { 位域列表     };

其中位域列表的形式为: 类型说明符 位域名:位域长度 

例如:

struct{unsigned int: 1;// bit_0 位域名缺省, 无名位域unsigned int bit_1 : 1;// bit_ 位定义域名为 bit_1unsigned 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);








原创粉丝点击