题目链接:查找输入整数二进制中1的个数_牛客题霸_牛客网 (nowcoder.com)
解题思路:
解法一:
可以举一个八位的二进制例子来进行分析,对于二进制操作,我们直到,除以一个2,原来的数字会减少一个0.如果除的过程有余数,那么就表示当前位置有一个1.
以10 100 010为例
第一次除以2时,商为10 100 001 余数为0
第二此除以2时,商为101 000 余数为1
因此,可以考虑利用整形数据除法的特点,通过相除和判断余数的值来进行分析。
解法二:
是计算一个数二进制表示中1的个数,通过(n >> i) & 1可以获取第i位的二进制值,每次n右移一位,可 以获取一位的二进制值,右移32次,n变成0,循环终止。
解法三:
利用val=val&(val-1)巧妙解法能最少次数统计1的个数
假设整数为4791
0000 0000 0000 0000 0001 0010 1011 0111
0000 0000 0000 0000 0001 0010 1011 0110
================================== count=1
0000 0000 0000 0000 0001 0010 1011 0110
0000 0000 0000 0000 0001 0010 1011 0101
================================== count=2
0000 0000 0000 0000 0001 0010 1011 0100
0000 0000 0000 0000 0001 0010 1011 0011
================================== count=3
0000 0000 0000 0000 0001 0010 1011 0000
...................
有几个1就统计几次
代码实现:
#include <iostream>
using namespace std;//解法一:
// int Count(size_t val)
// {
// int count=0;
// for(int i=0;i<32;i++)
// {
// if(val%2==1)
// count++;
// val=val/2;
// }
// return count;
// }
// int Count(size_t val)
// {
// int count=0;
// while(val)
// {
// if(val%2==1)
// count++;
// val=val/2;
// }
// return count;
// } // 解法二://int Count(size_t val)
//{
// int count=0;
// for(int i=0;i<32;i++)
// {
// if((val&0x01)==1)
// count++;
// val=val>>1;
// }
// return count;
//}
//解法三:
int Count(size_t val)
{int count=0;while(val){val=val&(val-1);count++;}return count;
}int main()
{size_t n=0;while(cin>>n){int count=Count(n);cout<<count<<endl;}return 0;
}