题目:求整数的二进制数及其中1的个数
解题思路:首先要求出二进制的每一位,通过除二取余法判断余数是1还是0,再将所有求出的余数放到一个容器里,最后反向输出就好了。设置一个计数器,每当余数为1时,计数器个数加一,最后打印出计数器的数字,即为该二进制中1的个数。
代码:
#include<iostream>
#include<vector>
using namespace std;
void main(){
int figure;
int a,b;
int count=0;
vector<int> ivec;
cout<<"请输入一个整数:\n";
cin>>figure;
while(figure){
a = figure%2;
b = figure/2;
ivec.push_back(a);
figure = b;
if(a==1)
count++;
}
cout<<"这个整数对应的二进制数为:";
for (vector<int>::iterator iter = ivec.end()-1; iter >= ivec.begin(); iter--)
{
cout << *iter ;
}
cout<<endl;
cout<<"其中1的个数是:"<<count<<endl;
}
看了网上大佬的解题思路,发现自己的解题过程效率确实太低了,赋上大佬的思路:
首先i和1做与运算,判断i的最低位是不是为1。接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1。基于此,我们得到如下代码:
int NumberOf1_Solution2(int i)
{
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(i & flag)
count ++;
flag = flag << 1;
}
return count;
}
按位运算的效率远高于做除法!!!!!!!!!