C语言中的位域结构体

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);








  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值