面试题10-二进制中1的个数

题目:

实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位1.因此输入9,该函数输出2.

这是一个位运算的题目,下面看一下二进制数移位的规则

(1)二进制左移,空位补0

(2)二进制右移,用符号位的数来补空位

二进制中的一些操作,位运算要比加减乘除运算快的多:

(1)除2的操作, n>>1

(2)乘2的操作, n<<1

(3)求余的操作, n&1  true为偶数, false为奇数

(4)将二进制数最后一个1变为0的操作, n&(n-1)  **********这一条非常的实用

根据这个题目,实用了两种算法来实现,代码如下:

#include <iostream>
using namespace std;

//定义一个数flag从1开始,与number做&操作,flag依次左移,int会左移32位
int GetNumberOf1InBinary(int number)
{
	int count = 0;
	unsigned int flag = 1;
	while(flag)
	{
		if(number & flag)
		{
			count++;
		}
		flag <<= 1;
	}
	return count;
}
//第二种方式,比较巧妙,可以做number中二进制的1的个数次比较就可以得出结果
//因为n&(n-1)会把n的最后一个1化为0,这样有几个1就循环几次
int GetNumberOf1InBinary1(int number)
{
	int count = 0;
	while(number)
	{
		count++;
		number = (number & (number-1));
	}
	return count;
}
int main()
{
	cout<<GetNumberOf1InBinary(10)<<endl;
	cout<<GetNumberOf1InBinary(-10)<<endl;
	
	cout<<GetNumberOf1InBinary1(10)<<endl;
	cout<<GetNumberOf1InBinary1(-10)<<endl;
	return 10;
}
相关的题目:

(1)用一条语句判断一个数是不是2的整数次方。

     换句话说这个数的二进制中只有一个1,  n&(n-1) 为false说明有一个1,为true,说明1的个数为0或者大于一个

(2)输入两个整数m和n,计算要改变m的二进制表示中的多少位才能得到n

 换句话说,找m和n中总共有多少位不一样, 首先m^n ,m^n中1的个数即为所求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值