返回參數二進制中 1 的個數

題目:寫一個函數,返回參數二進制中1的個數。
eg: 15——–00000000 00000000 00000000 00001111
思路:
(1)模除
模2 得到最後一位是不是1,如果是1,則count++,
除2去掉最後一位,繼續模2,除2 ,直到除2的結果爲0。
返回count(1的個數)
(拿到一位,去掉一位,除產生的數爲0,則結束)
代碼實現:

int count_bit_1(int n)
{
    int count=0;
    while(n)
    {
        if(n%2==1)
        {
            count++;
        }
        n=n/2;
    }
    return count;
}

看起來似乎很正確,我們測試了幾組數據:
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
15—-4
14—-3
-1—-0
-1中到底有幾個1呢?
整型數據要以二進制補碼錶示。
-1的原碼:10000000 ……00000001,-1的補碼:11111111 ……11111111。(32位)
所以-1中有32個1。
上述方法只適合計算正整形數據二進制中1的個數。
思路:一個整數有32位,我們把32位每一位判斷是不是1,用一個for循環,循環32次。
將參數的二進制序列右移(左移)【 右移>> 左移<<】
右移:將二進制序列向右移一位,左邊補符號位。
左移:將二進制序列向左移一位,右邊補0。
然後與(&)上1,判斷最後一位是不是1.
這裏寫圖片描述
代碼實現:

int count_bit_1(int n)
{
    int count = 0;
    int i = 0;
    for(i=0;i<32;i++)
    {
        if((n>>i)&1==1)
        {
            count++;
        }
    }
    return count;
}

優化:上述代碼無論參數有多少個1都循環32次,會有時間上的浪費。
可以做到 “有幾個1循環幾次”
n=n&(n-1)
每一次計算n的二進制位少了一個1,這個1是這個二進制中最後的一個1,一直與下去,直到爲0,與幾次,則有幾個0.
eg:
4—-0100(只有一個1)
0100&0011=0000(只與一次)
15—-1111(4個1)
1111&1110=1110
1110&1101=1100
1100&1011=1000
1000&0111=0000(與四次)
代碼實現:

int count_bit_1(int n)
{
    int count=0;
    while(n)
    {
        count++;
        n=n&(n-1);
    }
    return count;
}

我在VS2010編譯器
如果有誤,希望指出

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