位欄位何時有用

位元欄位用於將許多變數聚合成一個物件,類似於結構。這樣可以減少記憶體使用量,在嵌入式環境中尤其有用。

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

總之,位域通常用於記憶體受限的情況,在這種情況下,你有許多可以採用有限範圍的變數。