C語言—返回一個數二進制中1的個數

1.寫一個函數返回參數二進制中 1 的個數
代碼1:

int main()
{
    int num = 0;
    int count = 0;
    scanf("%d", &num);
    while (num)
    {
                          //此處不能寫爲if(num%2! = 0)
        if (num % 2 == 1)//若num=-1,此時餘數爲-1,count++不執行;
            count++;
        num = num /2;   //此時num=0,跳出循環。count=0,錯誤;實際應爲32.
    }
    printf("%d ", count);
    return 0;
}

錯誤代碼,如果num爲負數,則代碼就出錯了。

代碼2:

#include<stdio.h>

int main()
{
    int input = 0;
    int count = 0;
    int i = 0;
    scanf("%d", &input);
    for (i = 0; i < 32; i++)
    {
        if ((input >> i) & 1 == 1)
            count++;
    }
    printf("%d的二進制中1的個數爲 %d \n", input, count);
    return 0;
}

這個解法沒問題,可以實現功能,但每次求解都要循環32次,最好循環32次,接下來進行優化。

#include<stdio.h>

int main()
{
    int num = 0;
    int count = 0;
    scanf("%d", &num);
    while (num)
    {
            count++;
            num = num&(num - 1);//二進制下,從右往左,每次處理一位,直到num=0,跳出循環。
    }
    printf("%d ", count);
    return 0;
}

此代碼精髓在 num&(num-1) ,體會體會。
這種寫法最壞循環32次,比如-1,大大提高了效率。

由此擴展:判斷一個數是否爲2的N次方?

思考:2,4,8等減1按位與上本身爲0,即

if(num&(num-1)==0)
   printf("這個數是2的N次方\n");

奉上黑崎一護。

這裏寫圖片描述

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