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

Java 高效計算二進制中 1 的個數:Brian Kernighan 演算法

     編輯:Java 相關知識

演算法核心

Brian Kernighan 演算法利用位元運算特性:n & (n - 1) 會清除 n 二進制表示中 最低位的 1。重複執行直到 n == 0,迴圈次數即為 1 的個數。

範例追蹤

n = 14 (1110₂)

  1. 14 & 13 = 12 (1100₂) → count=1
  2. 12 & 11 = 8 (1000₂) → count=2
  3. 8 & 7 = 0 → count=3

結果:3 個 1。迴圈次數等於 1 的個數,而非位寬,對稀疏 1 極其高效。

Java 實作

package algorithm;

public class BitCount {
    public static void main(String[] args) {
        int[] test = {0, 1, 7, 14, 255, 1024, Integer.MAX_VALUE};
        for (int n : test) {
            System.out.printf("%d (0x%X) -> %d ones%n", n, n, countOnes(n));
        }
    }

    /**
     * 計算整數二進制中 1 的個數
     * 時間複雜度:O(k),k = 1 的個數
     * 空間複雜度:O(1)
     */
    public static int countOnes(int n) {
        int count = 0;
        while (n != 0) {
            n &= (n - 1);
            count++;
        }
        return count;
    }
}

替代方案比較

擴充:long 版本與負數處理

public static int countOnesLong(long n) {
    int count = 0;
    while (n != 0) {
        n &= (n - 1);
        count++;
    }
    return count;
}
// Java 整數為補碼表示,負數最高位為 1,演算法同樣適用
// 例:-1 (0xFFFFFFFF) -> 32 個 1

總結

Brian Kernighan 演算法是位元運算教科書級範例,展現「n & (n-1) 清除最低位 1」的巧思。實際開發中,請直接使用 Integer.bitCount() / Long.bitCount(),由 JVM 內建最佳化(硬體指令或查表),既簡潔又高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法時間複雜度備註
Brian KernighanO(k)k=1的個數,稀疏時極快
查表法 (8-bit/16-bit)O(1)需額外空間,適合極高頻呼叫
Integer.bitCount()O(1) 硬體指令JDK 內建,實際為 POPCNT 指令或優化查表,**生產環境首選**
逐位位移檢查O(32)固定 32 次迴圈,較慢