输入1个数输出其二进制表示中1的个数

面试题。题目描述就是写一个函数,要求输入一个数,输出其二进制表示中1的个数。此处假设输入的为int型。

方法一:首先想到的就是位运算,用移位得出每一位是否为1。代码如下所示。

#include <iostream>

using namespace std;

int numberof1(int in)
{
	int count = 0;
	int input = in;
	for(int i = 0; i < 32; i++)
	{
		if(1 == (input & 1))
			count++;
		input >>= 1;
	}
	return count;
}

int main()
{
	int numbertocount;
	cin>>numbertocount;
	cout<<numberof1(numbertocount)<<endl;
	return 0;
}


方法二:其次想到的是直接像数组一样取每一位的值,如此只要把所有的位相加起来,得出的值即为所求,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in)
{
	int count = 0;
	char input[32];
	itoa(in, input, 2);
	for(int i = 0; i < strlen(input); i++)
	{
		count += input[i] - '0';
	}
	return count;
}


方法三:不直接取每一位的值,采用除以2取余数,余数相加即为所求,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in)
{
	int count = 0;
	int input = in;
	for(int i = 0; i < 32; i++)
	{
		count += input % 2;
		input /= 2;
	}
	return count;
}


方法四:采用位运算变相得出1的个数,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in)
{
	int count = 0;
	int input = in;
	while(input)
	{
		count++;
		input &= input - 1;
	}
	return count;
}


方法五:不使用循环,采用空间换取时间的策略,如32位机中int为32位,定义2的32次方大小的int型数组,其中每个元素存对应序号的二进制表示中1的个数。如此求输入值的二进制表示中1的个数就可以转化成查表的方式来进行,查表的优化可以采用索引。

猜你喜欢

转载自blog.csdn.net/skeleton703/article/details/7522528