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

C 語言位運算實戰:右移 >> 與按位與 & 統計 1 的個數對比

     編輯:關於C

右移法(算術/邏輯右移區別)

int count = 0;
while (n) {
    if (n % 2 == 1) count++; // 或 n & 1
    n >>= 1;
}
  • 無符號數:邏輯右移,高位補 0;
  • 有符號數:實現定義(通常算術右移,高位補符號位),負數會陷入無限循環(如 -1 >> 1 仍為 -1)。統計 1 的個數必須用無符號類型。

按位與法(Brian Kernighan,推薦)

int count = 0;
while (n) {
    n &= (n - 1); // 清除最低位 1
    count++;
}
  • 循環次數 = 1 的個數,極快;
  • 無符號/有符號均正常工作(補碼特性)。

演示代碼

#include <stdio.h>

int main() {
    unsigned int a = 15; // 1111b
    // 右移法
    int c1 = 0, t = a;
    while (t) { if (t & 1) c1++; t >>= 1; }
    // 按位與法
    int c2 = 0; t = a;
    while (t) { t &= t-1; c2++; }
    printf("右移法: %d, 按位與法: %d\n", c1, c2); // 4, 4
    return 0;
}

總結

統計 1 的個數,**首選 n &= n-1**,配合 unsigned 類型,無符號右移次之,有符號右移禁用。

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