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

C語言位操作完全指南:位運算、移位技巧與實戰應用

     編輯:關於C語言

為什麼要學位操作?

C 語言被稱為「中級語言」,因其能直接操作硬件。位操作是底層編程、嵌入式開發、驅動程序編寫、高性能算法的基石。掌握位運算,即掌握了對計算機最基本存儲單元——位的控制權。

一、位的基本概念

  • 1 字節 = 8 位(現代系統亦有 16/32/64 位字長,但字節仍為 8 位)。
  • 無符號字節範圍:0~255(00000000~11111111)。
  • 位編號:通常從右向左,第 0 位為最低位(LSB),第 7 位為最高位(MSB)。
  • 示例:char c = 100; 二進制 01100100(十六進制 0x64)。

二、四大位邏輯運算符詳解

運算符名稱類型規則典型用途
&位與雙目同為 1 結果 1,否則 0清零特定位、掩碼檢測
|位或雙目同為 0 結果 0,否則 1置位特定位、合併標誌
^位異或雙目相同為 0,不同為 1翻轉特定位、加密、校驗
~取反/補碼單目0 變 1,1 變 0生成掩碼、位翻轉

僅限整型表達式使用。

實戰技巧:位的設置、清零、翻轉

// 設置第 6 位為 1(掩碼 0x40 = 01000000)
c = c | 0x40;

// 清零第 6 位(掩碼 0xBF = 10111111)
c = c & 0xBF;

// 翻轉第 6 位(掩碼 0x40)
c = c ^ 0x40;

// 僅保留第 6 位,其餘清零
c = c & 0x40;

三、移位運算符:高效乘除法與位對齊

運算符名稱行為數學等價
<<左移低位補 0,高位丟棄乘以 2n
>>右移無符號高位補 0;有符號保持符號位(算術右移)除以 2n(向下取整)
int a = 5;      // 00000101
int b = a << 2; // 00010100 = 20 (5*4)
int c = a >> 1; // 00000010 = 2  (5/2)

注意:移位數不得超過類型位寬,否則行為未定義。

四、經典實戰:統計整數中二進制 1 的個數

問題:輸入整數,輸出其二進制表示中 1 的個數。如 67 (0x43) → 3。

#include <stdio.h>

int countOnes(int num) {
    int count = 0;
    while (num) {
        count += num & 1;  // 檢查最低位
        num >>= 1;       // 右移一位
    }
    return count;
}

int main() {
    int num;
    scanf("%d", &num);
    printf("%d\n", countOnes(num));
    return 0;
}

進階優化:num &= (num - 1) 可直接清除最低位的 1,循環次數等於 1 的個數(Brian Kernighan 算法)。

五、應用場景

  • 硬件寄存器操作(GPIO、中斷控制器、UART 配置)。
  • 標誌位壓縮存儲(一個 int 存 32 個布爾開關)。
  • 網絡協議解析(IP 頭、TCP 標誌位)。
  • 圖像處理(像素分量提取、Alpha 混合)。
  • 加密算法、校驗和、哈希函數核心邏輯。

總結

位操作看似晦澀,實則是通往計算機底層的鑰匙。熟練掌握 & | ^ ~ << >>,配合掩碼技巧,能編寫出極致高效、資源節約的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved