題目:請實現一個函數,輸入一個整數,輸出該二進制中表示的1的個數。例如9的二進制是1001,二進制中有2個1,所以輸出2。
思路:統計二進制中1的個數實際上就是進行位運算。
解法一:分別判斷最低位,次低位,次次低位。。。是不是1。然後統計數量。拿數字9爲例,二進制爲1001。我們讓9和1進行與運算,1001 & 0001爲1,計數元素就+1,也就說明最低位爲1,然後將1左移一位變成0010,然後9再和0010進行位運算,1001 & 0010爲0,計數器不變,也就是說次低位不爲1,以此類推直到結束
#include<stdio.h>
int number1(int n)
{
int num=0;
int m=1;
while(n>=m)
{
if(n&m)
{
num++;
}
m=m<<1;
}
return num;
}
int main()
{
int m;
scanf("%d",&m);
int n=number1(m);
printf("%d",n);
}
解法二:我們這次可以不用1進行比較,想想把9的二進制數1001裏面的1經過操作逐漸消去裏面的1,我們發現將一個二進制數-1後二進制數的變化規律,如果二進制數末尾是0,那麼-1以後前面原本是1的那個位置變爲0,然後原本1後面位置都取反,前面則不變。如果末尾是1則末尾變爲0,其餘不動。所以當我們讓n和n-1做與操作時就把n這個二進制數的最右邊的那個1變爲了0,這種思路也可以作爲我們解題的思路之一。
#include<stdio.h>
int number2(int n)
{
int num=0;
while (n)
{
num++;
n=n&(n-1);
}
return num;
}
int main()
{
int m;
scanf("%d",&m);
int n=number2(m);
printf("%d\n",n);
}