方法一:最簡單的循環位運算
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),但空間佔用比較大,且數組的尋址開銷也很大。只有在特定環境中才建議使用。