位运算思维解题技巧二:按位与&和左右移动 统计二进制中1的个数
引子:二进制中1的个数
方法一:比较每一位:左移法(以原数n为参照移动1)
方法二: 比较每一位:右移法(以1为参照移动原数n)
方法三:公式法,得懂二进制减法
不懂就记住公式:(n-1)&n 的作用是消掉最低位的1(公式法!!!)
代码实现:
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int num = 0;
//比较每一位:左移法(以原数n为参照移动1)
for(int i = 0;i < 32;i++)
{
if((n&(1<<i))==(1<<i))
num++;
}
cout<<num<<endl;
//比较每一位:右移法(以1为参照移动原数n)
num = 0;
for(int i = 0;i < 32;i++)
{
if(((n>>i)&1)==1)
num++;
}
cout<<num<<endl;
num = 0;
//第三种方法:(n-1)&n 的作用是消掉最低位的1(公式法!!!)
while(n!=0)
{
n = (n-1)&n;
num++;
}
cout<<num<<endl;
}
补充一道题:
这个题与上一题其实基本一样,可以转换为这个二进制数中是否只有一个1!!!代码很好写,就略了