题目:
实现一个函数,输入一个整数,输出该数二进制表示中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的个数即为所求