您的位置:首页 > 其它

第二十八题(整数的二进制表示中1的个数)

2014-06-22 17:26 127 查看
28.整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1。

例如输入10,由于其二进制表示为1010,有两个1,因此输出2。

这道题的另外一个变种是:求两个整数二进制表示形式中有多少个位上的数据不同。其实对这两个整数进行异或运算就可以转换成本题,最终还是求一个异或得到的整数二进制表示形式中1的个数。

这里提供两种思路

1:直接计数

考虑到输入的整数可能为负数,直接对其进行向右移位操作时,会将最高位符号位移入到低位,所以采用(1<<i)&number这种方法。

2.number&= number-1

这是一种很经典的位运算计较,可以将number中最低位的1变为0,重复执行该运算直到number为零,执行该运算的次数即为number中1的个数。

在整数中1个数较少的情况下,比思路1中循环计数的方法效率要很高。

代码:

#include "stdafx.h"
#include<iostream>
using namespace std;
namespace MS100P_28
{
	int countOnesOfIntiger1(int number)
	{
		int bits = 8*sizeof(int);
		int count = 0;
		for (int i = 0; i < bits;i++)
		if ((1 << i)&number)
			count++;
		return count;
	}
	int countOnesOfIntiger2(int number)
	{
		int count=0;
		while (number != 0)
		{
			number = number&(number - 1);
			count++;
		}
		return count;
	}
	void test()
	{
		int n = -6;
		cout << countOnesOfIntiger1(n) << endl;
		cout << countOnesOfIntiger2(n) << endl;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	MS100P_28::test();
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: