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

C 語言位運算實戰技巧:統計 1 的個數、提取奇偶位、判斷名次連續、異或找不同位、二進制翻轉、無溢位平均值

     編輯:關於C語言

C 語言位運算實戰技巧:統計 1 的個數、提取奇偶位、判斷名次連續、異或找不同位、二進制翻轉、無溢位平均值

位運算是 C 語言高效編程的核心技能。本文匯總 7 個實戰場景,展示 &、|、^、~、<<、>> 組合拳解決實際問題。

一、 統計二進制中 1 的個數

int count_ones(unsigned int x) {
    int cnt = 0;
    while (x) { x &= (x - 1); cnt++; } // 每次清除最低位 1
    return cnt;
}

二、 提取 32 位整數的奇數位與偶數位

void extract_odd_even_bits(int num) {
    int odd[16], even[16];
    for (int i = 0, j = 0; j < 32; i++, j += 2) odd[15-i] = (num >> j) & 1;
    for (int i = 0, j = 1; j < 32; i++, j += 2) even[15-i] = (num >> j) & 1;
    // 輸出高位到低位
}

三、 判斷 5 個名次是否連續(撲克順子判斷)

int is_consecutive(int a,int b,int c,int d,int e) {
    int mask = 0;
    mask |= 1 << (a-1); mask |= 1 << (b-1); mask |= 1 << (c-1);
    mask |= 1 << (d-1); mask |= 1 << (e-1);
    // 連續 <=> mask 為連續 1(如 0b11111),檢查 (mask & (mask+1)) == 0 且無間隙
    // 簡化:統計 1 的個數為 5 且 max-min == 4
    return 1; // 略
}

四、 兩 32 位整數二進制不同位個數

int diff_bits(int a, int b) {
    int cnt = 0;
    for (int i = 0; i < 32; i++)
        if ( ((a>>i)&1) ^ ((b>>i)&1) ) cnt++;
    return cnt;
}

五、 32 位無符號整數二進制翻轉

uint32_t reverse_bits(uint32_t x) {
    uint32_t rev = 0;
    for (int i = 0; i < 32; i++) {
        rev = (rev << 1) | (x & 1);
        x >>= 1;
    }
    return rev;
}

六、 無溢位求兩整數平均值

int avg_no_overflow(int a, int b) {
    return (a & b) + ((a ^ b) >> 1);
}
// a&b: 共同進位部分;a^b: 無進位和;右移 1 等價除 2。

七、 找出陣列中唯一出現一次的數字(其餘成對)

int find_single(int arr[], int n) {
    int res = 0;
    for (int i = 0; i < n; i++) res ^= arr[i];
    return res;
}

八、 總結

位運算核心模板:

  • x & (x-1) 清除最低位 1
  • x & -x 取最低位 1
  • x ^ y 無進位加 / 翻轉 / 找不同
  • (a&b) + ((a^b)>>1) 無溢位平均
  • 1 << n 生成單一位掩碼

熟練這些模式,位運算題秒解。

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