位元欄位讓我們以結構體成員方式直接存取整數內的特定位元,常用於硬體暖存器映射、通訊協定解析、旗標壓縮儲存。本文以 8 位元為例示範基本用法。
struct ByteBits {
unsigned char b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
};
: 1 宣告該成員佔 1 位元。編譯器會自動排列位移,總大小通常為 1 byte(視對齊而定)。
#include
#include
struct ByteBits {
unsigned char b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
};
int main(void)
{
unsigned char x = 1; /* 0000 0001 */
struct ByteBits *pb = (struct ByteBits*)&x;
pb->b4 = 1; /* 設定第 5 位(索引 4) */
printf("x = %d (0x%02X)\n", x, x); /* 輸出 17 (0x11) */
system("pause");
return 0;
}
x = 17 (0x11)
原值 0x01(僅 bit 0 為 1),設定 bit 4 後變 0x11(bit 0 與 bit 4 為 1)。
unsigned:有號位元欄位實作定義行為(如負值表示)。&pb->b4 非法,因位元無位址。sizeof 確認。GET_BIT(x,n) / SET_BIT(x,n) 以位元運算手動處理。