★ 定義 ★
位欄位是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;
++++++++++++