【笔试题】计算一个整数存储在内存中二进制中1的个数
1、题目描述
计算一个整数存储在内存中二进制中1的个数
2、分析与代码
方法1:
计算整数中二进制1的个数,最先想到的应该是每右移一位判断最低位是否为1,为1说明是奇数,取余2应该等于1,反之说明是偶数。
#include<iostream>
using namespace std;
int main()
{
int num;
cin>>num;
int count=0; //计数
while(num)
{
if(num%2 ==1)
count++;
num=num>>1;
}
cout<<count<<endl;
return 0;
}
思考之后,发现方法1存在一个很大的缺陷,在于它不能计算负整数中二进制1的个数。
方法2:
#include<iostream>
using namespace std;
int main()
{
int num;
cin>>num;
int count=0; //计数
for(int i=0;i<32;++i)
{
if((num>>i)&1 == 1)
count++;
}
cout<<count<<endl;
return 0;
}
这种方法虽然可以,但是能不能更加优化,因为它这里必须要进行32次循环。
方法3:
#include<iostream>
using namespace std;
int main()
{
int num;
while(cin>>num)
{
int count=0; //计数
while(num)
{
count++;
num=num&(num-1);
}
cout<<count<<endl;
}
return 0;
}