面试题。题目描述就是写一个函数,要求输入一个数,输出其二进制表示中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的个数就可以转化成查表的方式来进行,查表的优化可以采用索引。