求一個十進制數轉化成二進制後bit爲0或1的個數

原文地址

求一個十進制數轉化成二進制後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 :)

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