1. 程式人生 > >【面試題】劍指offer10--求一個數的二進位制數中的1的個數

【面試題】劍指offer10--求一個數的二進位制數中的1的個數

求一個數二進位制數中的個數

第一種方法:模除法

程式碼如下:

//Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的
//1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入是9
//改函式輸出2。
#include<iostream>
using namespace std;

int TheNumOf1(int num)//統計二進位制中1的個數
{
	int count = 0;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num = num / 2;
	}
	return count;
}
int main()
{
	int num = 0; 
	int ret = 0;
	cout << "請輸入一個數字:";
	cin >> num;
	ret = TheNumOf1(num);
	cout << num << "的二進位制數中的1的個數為:" << ret << endl;
	system("pause");
	return 0;
}
第二種方法:第一種方法的優化,解決傳入的數字是負數的問題
//Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的
//1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入是9
//改函式輸出2。
#include<iostream>
using namespace std;
int TheNumOf1(unsigned int num)
{
	int count = 0;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num = num / 2;
	}
	return count;
}
int main()
{
	int num = 0; 
	int ret = 0;
	cout << "請輸入一個數字:";
	cin >> num;
	ret = TheNumOf1(num);
	cout << num << "的二進位制數中的1的個數為:" << ret << endl;
	system("pause");
	return 0;
}
第三種方法:對前兩種方法的優化,為了解決沒一個數字都是32位的位元位,使用下面的方法:
//Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的
//1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入是9
//改函式輸出2。
#include<iostream>
using namespace std;
int TheNumOf1(unsigned int num)
{
	int count = 0;
	for (int i = 1; i < 32; i++)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num = num / 2;
	}
	return count;
}
int main()
{
	int num = 0; 
	int ret = 0;
	cout << "請輸入一個數字:";
	cin >> num;
	ret = TheNumOf1(num);
	cout << num << "的二進位制數中的1的個數為:" << ret << endl;
	system("pause");
	return 0;
}
第四種方法:使用按位與的方法,可以更快的執行程式
//Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的
//1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入是9
//改函式輸出2。
#include<iostream>
using namespace std;
int TheNumOf1(unsigned int num)
{
	int count = 0;
	while (num)
	{
		num = num&(num - 1);
		count++;
	}
	return count;
}

int main()
{
	int num = 0; 
	int ret = 0;
	cout << "請輸入一個數字:";
	cin >> num;
	ret = TheNumOf1(num);
	cout << num << "的二進位制數中的1的個數為:" << ret << endl;
	system("pause");
	return 0;
}
使用這幾種方法都可以求解出一個數二進位制數中的1的個數