幾種求32位數中1的個數的算法

方法一:最簡單的循環位運算

int count1(int i)
{
    int num=0;
    while(i!=0) 
    {
        num += i & 0x01;
        i >>>= 1;
    }
    return num;
}

時間複雜度是O(n),且n一定是32。

方法二:n&(n-1)

int count2(int i) 
{
    int num = 0;
    while(i!=0) {
        i &= (i-1);
        num++;
    }
    return num;
}

時間複雜度也是O(n),但只有在最壞情況下n才爲32

方法三:查表發

查表發利用空間換取時間,利用一個32位的數組存儲0~2^32的數每個數字的1的位數,利用arr[n]即可得到結果,時間複雜度爲O(1),但是空間複雜度爲O(2^n)。一般情況下不會使用一個大表直接查詢,而是將32位拆分成4個8位數字,分別進行4次查表操作,然後將結果相加。

int count3(int n)
{
    int[] bitCount = new int[256]{0,1,1,2,1,2,...};
    return bitCount[n>>>24] +
           bitCount[(n&0x00ff0000) >> 16] +
           bitCount[(n&0x0000ff00) >> 8]  +
           bitCount[(n&0x000000ff)];
}

時間複雜度爲O(1),但空間佔用比較大,且數組的尋址開銷也很大。只有在特定環境中才建議使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章