# 面试题: 求一个整数二进制中 1 的个数?
/*
题目: 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。
例如把 9 表示为二进制是 1001, 有两个 1;因此,如果输入 9,则输出 2;
*/
题目分析:
学过计算机机基础的同学应该都知道,在计算机中的存储都是以二进制形式存在的! 那么求出一个整数
二进制中 1 的个数,当然不在话下了, 看到这道题的的时候应该都是信息满满; 注意: 当面试的时候遇到这道题,
就得仔细思考一下了,面试官不会那么无聊吧! 无非就是把整数变成二进制,用计数器加出来其中 1 的个数嘛1 !
对,没问题,那么问题就在于实现时的细节了,老话常说:细节决定成败!
算法选择:
已经很明确了,选择计数器,循环; 那么我们来看下面实现的几个版本有什么不同!
代码实现: @算法 (一)>>>>将num 的二进制和1进行按位&, 则&操作两个都为 1 结果才为1 ,否则为 0;
用每次结果为1时 ,count+1;
int NumberOf1(num)
{
int count = 0;//计数器
while(num)
{/*
这块的num&1 相当于 num%2;num>>1相当于num / 2;
但是移位运算要比除法运算的效率高得多!
*/
if(num & 1)
count++;
num = num>>1;
}
return count;
}
int NumberOf1(num)
{
int count = 0;//计数器
int flag = 1;
while(flag)//循环32次后flag自动变为0;
{
if(num & flag)
count++;
flag = flag << 1;
}
return count;
}
int NumberOf1(num)
{
int count = 0;//计数器
int i =0;
for(;i<32;i++)
{
if(num & 1)
count++;
num>>=1;
}
return count;
}
int NumberOf1(num)
{
int count = 0;//计数器
while(num)
{
++count;
num = num & (num - 1);
}
return count;
}