问题: 输入一个int型的数,求该数二进制中有多少个1。
解法一: 将1进行左移运算,逐位进行比对,如果该位不是1,&运算后的 结果必然为0。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int cnt=0;
for(int i=0;i<32;i++) //int 为32位
{
if(((1<<i)&n)!=0) //如果对应的位上是0则该位运算的结果为0
cnt++;
}
cout<<cnt;
return 0;
}
解法二: x-1会把低位的第一个1变为0,该位后的全部0变为1,(x-1)&x 则把低位的一个1变为0,反复下去,直到这个数等于0,统计1变为0的次数就是答案。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int cnt=0;
while(n)
{
cnt++;
n=n&(n-1);
}
cout<<cnt;
return 0;
}
解法三: 回溯法(核心是除2取余)统计1的个数。
代码实现:
#include<iostream>
using namespace std;
int cnt=0;
void fun(int n) //除二取余法
{
if(n==0) return;
fun(n/2);
//回溯
if(n%2==1)
cnt++;
}
int main()
{
int n;
cin>>n;
fun(n);
cout<<cnt;
return 0;
}