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

C 語言位運算技巧:計算兩數二進制不同位數

     編輯:關於C語言

C 語言位運算技巧:計算兩數二進制不同位數

兩數對應位不同 ⇔ 異或結果為 1。統計 a ^ b 中 1 的個數即為漢明距離。

實作程式碼

#include <stdio.h>

int hamming_distance(int a, int b) {
    int diff = a ^ b;
    int count = 0;
    while (diff) {
        count++;
        diff &= (diff - 1); // 清除最低位 1 (Brian Kernighan 演算法)
    }
    return count;
}

int main() {
    printf("3(011) vs 5(101) -> %d\n", hamming_distance(3, 5)); // 2
    printf("10 vs 10 -> %d\n", hamming_distance(10, 10));       // 0
    printf("-1 vs 0 -> %d\n", hamming_distance(-1, 0));         // 32 (全1 vs 全0)
    return 0;
}

核心技巧:n & (n-1) 清除最低位 1

n      = 0010 1100
n - 1  = 0010 1011
n & (n-1) = 0010 1000  → 最低位 1 被清零
  • 迴圈次數 = 1 的個數,最壞 32 次 (32-bit),平均 16 次。
  • 無分支預測失敗,效能極佳。

硬體加速

  • x86 SSE4.2: _mm_popcnt_u32 (POPCNT 指令)。
  • GCC/Clang: __builtin_popcount(a ^ b) 自動使用硬體指令或軟體模擬。
  • C++20: std::popcount(a ^ b) (<bit>)。

應用場景

領域用途
錯誤校正碼海明距離判斷糾錯能力
密碼學差分分析、側通道攻擊
資訊檢索SimHash 相似度計算
網路BGP 路徑屬性比較
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved