劍指offer面試題:二進制中1的個數(位運算)

題目:請實現一個函數,輸入一個整數,輸出該二進制中表示的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);
}

 

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