位字段何时有用

比特字段用于将许多变量聚合成一个对象,类似于结构。这样可以减少内存使用量,在嵌入式环境中尤其有用。

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

总之,位域通常用于内存受限的情况,在这种情况下,你有许多可以采用有限范围的变量。