首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言位元欄位實戰:以結構體操作單一位元

     編輯:關於C

前言

位元欄位讓我們以結構體成員方式直接存取整數內的特定位元,常用於硬體暖存器映射、通訊協定解析、旗標壓縮儲存。本文以 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(視對齊而定)。

實作範例:設定第 5 位

#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:有號位元欄位實作定義行為(如負值表示)。
  • 記憶體配置與序:C 標準未規定位元在 byte 內的排列順序(LSB-first 或 MSB-first),跨平台移植時需驗證。
  • 不可取位址:&pb->b4 非法,因位元無位址。
  • 對齊與大小:結構體大小可能大於位元總和(編譯器對齊),用 sizeof 確認。
  • 替代方案:可攜性要求高時,改用巨集 GET_BIT(x,n) / SET_BIT(x,n) 以位元運算手動處理。

應用場景

  • 硬體暖存器映射(GPIO、UART 控制暫存器)
  • 網路封包標頭解析(TCP Flags、IP 版本/首部長度)
  • 狀態旗標壓縮(單一 byte 存 8 個 bool 旗標)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved