C語言位運算

西北野狼發表於2024-08-28

在 C 語言中,位運算是對二進位制位進行的操作。以下是關於 C 語言位運算的介紹:

一、常見的位運算子

  1. 按位與(&):

    • 規則:兩個對應的二進位制位都為 1 時,結果位為 1,否則為 0。
    • 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位與運算,結果為 0001,即 1。
  2. 按位或(|):

    • 規則:兩個對應的二進位制位只要有一個為 1 時,結果位為 1,否則為 0。
    • 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位或運算,結果為 0111,即 7。
  3. 按位異或(^):

    • 規則:兩個對應的二進位制位不同時,結果位為 1,相同時為 0。
    • 例如:5(二進位制為 0101)與 3(二進位制為 0011)進行按位異或運算,結果為 0110,即 6。
  4. 取反(~):

    • 規則:將二進位制位的每一位取反,即 0 變為 1,1 變為 0。
    • 例如:~5(二進位制為 0101),結果為 1010,即按位取反後為 -6(在有符號整數中,最高位為 1 表示負數)。
  5. 左移(<<):

    • 規則:將一個數的二進位制表示向左移動指定的位數,右邊用 0 填充。
    • 例如:5(二進位制為 0101)左移 2 位,結果為 20(二進位制為 10100)。
  6. 右移(>>):

    • 規則:對於有符號數,將一個數的二進位制表示向右移動指定的位數,左邊用符號位填充;對於無符號數,左邊用 0 填充。
    • 例如:5(二進位制為 0101)右移 2 位,結果為 1(二進位制為 0001)。

二、位運算的應用場景

  1. 高效的標誌位處理:

    • 可以用一個整數的不同位來表示不同的標誌狀態。例如,可以用一個位元組來表示 8 個不同的開關狀態,透過位運算來設定、清除和檢查這些標誌位。
    • 程式碼示例:
      unsigned char flags = 0;
      // 設定第 3 個標誌位
      flags |= (1 << 2);
      // 檢查第 3 個標誌位是否設定
      if (flags & (1 << 2)) {
          printf("Third flag is set.\n");
      }
      // 清除第 3 個標誌位
      flags &= ~(1 << 2);
      
  2. 資料的壓縮和編碼:

    • 在某些情況下,可以透過位運算來壓縮資料,減少儲存空間的佔用。例如,可以將多個小的整數打包到一個較大的整數中。
    • 程式碼示例:
      unsigned int packTwoNumbers(unsigned char num1, unsigned char num2) {
          return (num1 << 8) | num2;
      }
      
  3. 位掩碼操作:

    • 可以使用位掩碼來選擇或遮蔽特定的位。例如,要獲取一個整數的低 4 位,可以使用位掩碼 0x0F。
    • 程式碼示例:
      unsigned int num = 0xABCD;
      unsigned char lowFourBits = num & 0x0F;
      
  4. 快速計算乘除 2 的冪次方:

    • 左移一位相當於乘以 2,右移一位相當於除以 2。
    • 程式碼示例:
      int num = 5;
      int doubled = num << 1; // 10
      int halved = num >> 1; // 2
      

總之,位運算在 C 語言中是一種強大的工具,可以用於最佳化程式碼、處理特定的資料格式和實現一些特定的演算法。但在使用位運算時,需要小心處理邊界情況和確保程式碼的可讀性。

相關文章