求一個十進制數轉化成二進制後bit爲0或1的個數
1、首先解決bit爲1的個數,函數如下:
int CountOneNum (int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count ++;
}
return count;
}
2、求bit爲0的個數,這種做法在複雜度上比(1)大,因爲(1)的循環次數只與二進制數中1的個數一樣,而下面算法的時間複雜度爲 log(n),函數如下:
int CountZeroNum (int n)
{
int count = 0;
while (n != 0)
{
if (n % 2 == 0)
{
count ++;
}
n /= 2;
}
return count;
}
3、後來在網上看到一個更爲通用的解法,可以求十進制數 x 換算成 n 進制後數爲 k 的個數,其實這種做法就是將上面計算bit爲0的個數的函數進行改造,使之更通用,算法時間複雜度也爲 log(n),函數如下:
int count (int x , int n , int k)
{
int num = 0;
while (x != 0)
{
if (x % n == k)
{
num ++;
}
x /= n;
}
return num;
}
4、使用位操作的方法,此方法中循環次數與二進制數位數一樣,函數如下
int num1 = 0;//bit位爲1的個數
int num0 = 0;//bit位爲0的個數
void count(int n)
{
while(n)
{
if (n & 0x01)
{
num1 ++;
}
else
{
num0 ++;
}
n >>= 1;
}
}
be better :)