这里要介绍3种解法
第一种;(常规解法)
数在计算机内部都是用二进制表示的,所以可连续用数n除2
代码1:
<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{
int n,m;
m=0;
cin>>n;
while(n)
{
if(n%2) //如果n不能整除2,说明当前n的末尾数为1
m++;
n>>=1; //n右移1位,即n/2
}
cout<< m <<endl;
return 0;
}</span>
第二种:使用位操作
&:若a为1,且b为1,则a&b为1,否则,a&b为0
这里初始化i=0x1;
n&i若为1,则n的末尾为1,否则为0
代码2:
<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{
// 使用位操作,1 和 二进制的最后一位进行 与(&) 运算
int n,i,m;
m=0;
i=0x1;
cin>>n;
while(n)
{
m+=(n&i);
n>>=1;
}
cout << m <<endl;
return 0;
}</span>
第三种:使用另一种位操作
若n的二进制表示为0010 0000,则第二种算法明显有待改进
可让n与n-1进行 & 运算,若n&(n-1)==0,则为上述情况(n的二进制表示中,只有一位是 0)。
代码3:
<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{
int n,m;
m=0;
cin>>n;
while(n)
{
n&=(n-1);
m++;
}
cout << m <<endl;
return 0;
}</span>