1. 程式人生 > >輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

如何求二進位制中1的個數(三種方法)

思路:1.在32位中,二進位制表示數字1方式為 00000000 00000000 00000000 00000001

首先我們的第一個方法就是一位一位的找,從左邊第一位開始,每一次&1,則可以判斷

最後一位是否為1 ,程式碼如下:

#include <stdio.h>

int Num_one(int num)
{
	int i = 0;
	int count = 0;
	for(i=0; i<32; i++)
	{
		if(((num>>i)&1) ==1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int num = 0;
	int ret = 0;
	printf("請輸入一個數:");
	scanf("%d",&num);
	ret = Num_one(num);
	printf("該數二進位制中一的個數為:%d\n",ret);
	return 0;
}
2.迴圈32次感覺有點慢,所以用模除2的方式嘗試一下。程式碼如下
int Num_one(unsigned int num)//一定要用無符號數,不然負數不好搞
{
	int count = 0;
	while(num)
	{
		if((num%2) == 1)
			count++;
		num /= 2;
	}
	return count;
}
int main()
{
	int num = 0;
	int ret = 0;
	printf("請輸入一個數:");
	scanf("%d",&num);
	ret = Num_one(num);
	printf("該數二進位制中一的個數為:%d\n",ret);
	return 0;
}
嗯,感覺還不錯。

3.利用數本身和(該數-1)相與的方式,感覺也不錯,這個方式的思路是,當數字二進位制-1時,最左邊的的1會被變為0,再和原數字相與,就取出了二進位制最左邊的1。

例如數字5的二進位制:101&(101-1)=100,此時已經取出最左邊的1,再用 100&(100-1)=000,此時就將兩個1全部取出。

程式碼如下:

int Num_one(int num)
{
	int count = 0;
	while(num)
	{
		num = num&(num-1);
		count++;
	}
	return count;
}
int main()
{
	int num = 0;
	int ret = 0;
	printf("請輸入一個數:");
	scanf("%d",&num);
	ret = Num_one(num);
	printf("該數二進位制中1的個數為:%d\n",ret);
	return 0;
}
結果展示: