C 語言筆記:Bit 操作

在低階程式設計、嵌入式系統、驅動程式開發中,我們常需要直接操作變數的位元(bit)。

下面筆記幾種工具/用法。

 

Bitfield

在 struct 裡面用位元為單位定義欄位大小。 

struct Status {
    unsigned int power : 1;   // 1 bit
    unsigned int error : 1;   // 1 bit
    unsigned int mode  : 2;   // 2 bits
    unsigned int count : 4;   // 4 bits
};

int main() {
    struct Status s = {1, 0, 3, 9};
    printf("Size of struct: %zu bytes\n", sizeof(s));
    return 0;
}

在一些系統中會搭配 union 使用 (請參見 C 語言筆記:保留關鍵字 中的 union)。 

另外要注意的是,bit 的順序可能會隨著系統、編譯器的不同而有所改變 (請參見 C 語言筆記:little endian 與 big endian )。跨平台開發時,必須考慮 Endianness,否則同一段程式在不同架構可能產生相反的結果。

 

Bitwise 

針對 bit 進行的運算。

常用運算子:

  • &:AND
  • |:OR
  • ^:XOR;不同為 1,相同為 0
  • ~:NOT;反轉所有 bit
  • <<:向左移位並補 0(相當於乘 2)
  • >>:向右移位並補 0(相當於除 2) 

因為 signed int 在許多計算中會出現,所以在


Bitmask

  • 設定第二個 bit: value |= BIT2;
  • 清除第二個 bit: value &= ~BIT2;
  • 切換第二個 bit: value ^= BIT2;
  • 檢查第二個 bit 是否為 1: (value & BIT2) != 0;



留言