位字段何时有用
比特字段用于将许多变量聚合成一个对象,类似于结构。这样可以减少内存使用量,在嵌入式环境中尤其有用。
e.g. consider the following variables having the ranges as given below.
a --> range 0 - 3
b --> range 0 - 1
c --> range 0 - 7
d --> range 0 - 1
e --> range 0 - 1
如果我们分别声明这些变量,那么每个变量必须至少是一个 8 位整数,所需的总空间将是 5 个字节。此外,变量不会使用 8 位无符号整数(0-255)的整个范围。在这里我们可以使用位字段。
typedef struct {
unsigned int a:2;
unsigned int b:1;
unsigned int c:3;
unsigned int d:1;
unsigned int e:1;
} bit_a;
结构中的位字段与任何其他结构的访问方式相同。程序员需要注意变量是在范围内写的。如果超出范围,则行为未定义。
int main(void)
{
bit_a bita_var;
bita_var.a = 2; // to write into element a
printf ("%d",bita_var.a); // to read from element a.
return 0;
}
通常程序员想要将位域集合归零。这可以逐个元素地完成,但是有第二种方法。只需使用大于或等于结构大小的无符号类型创建上述结构的并集。然后,可以通过将该无符号整数归零来将整个位字段集合归零。
typedef union {
struct {
unsigned int a:2;
unsigned int b:1;
unsigned int c:3;
unsigned int d:1;
unsigned int e:1;
};
uint8_t data;
} union_bit;
用法如下
int main(void)
{
union_bit un_bit;
un_bit.data = 0x00; // clear the whole bit-field
un_bit.a = 2; // write into element a
printf ("%d",un_bit.a); // read from element a.
return 0;
}
总之,位域通常用于内存受限的情况,在这种情况下,你有许多可以采用有限范围的变量。