位字段
★ 定义 ★位字段是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。
★ 用途 ★它主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。
★ 用法 ★看如下位字段的定义:
typedef struct _bit_field {
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int d : 4;
} bit_field_s;
在如上定义中,bit_field_s结构体只占用一个word的空间,即4个字节。其中成员a占用5位,成员b占用3位,成员c占用20位,成员d占用4位。我们可以对bit_field_s结构体的成员进行如下赋值:
bit_field_s x;
x.a = 4;
x.b = 7;
x.c = 1024;
x.d = 13;
在定义位字段时还可以不指定成员的名称,看如下定义:
typedef struct _bit_field {
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int : 4;
} bit_field_s;
在如上定义中,最后一个成员只是用于占位,使结构体按word对齐。而如下定义就和上面的定义是一样的效果:
typedef struct _bit_field {
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int : 0;
} bit_field_s;
最后一个成员的0位宽度用于强制结构体按word对齐。
★ 注意 ★对于位字段中的成员不能用位操作符进行运算,因为它们没有地址。考虑到字节存放的大端小端的问题,使用位字段定义的数据不能在不同字节顺序的机器之间移动。因此,从理论上来说,使用位字段的程序是不可移植的。
其实,我们完全可以用位操作来实现位字段的功能,它们在编译后的代码与效率上是一样的。
例如:设置bits的5-9位为value
+++ 位操作 +++
unsigned int bits;
bits &= ~(0x1f<<5) /* 将5-9位设置为0 */
bits |= value<<5 /* 设置5-9位的值 */
+++ 位字段 +++
struct {
unsigned int a : 5;
unsigned int b : 5;
unsigned int c : 22;
} bits;
bits.b = value;
++++++++++++