输入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的个数就可以转化成查表的方式来进行,查表的优化可以采用索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值