方法1: 通过与初始值为1的标志位进行与运算,判断最低位是否为1; 然后将标志位左移,判断次低位是否为1; 循环上述内容,直到将每一位都判断完毕。
//<bits/stdc++.h>包含了所有C++的头文件
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0,num;
//无符号类型则仅能表示大于等于0的值
unsigned int flag = 1;
cin>>num;
while(flag){
if(num & flag)
n++;
flag = flag << 1;
}
cout<<n;
}
方法2: 对某一个整数和其减一后的数值进行与运算; 将其所得结果再次和结果减一后的数值进行与运算; 循环上述过程,直到与运算的结果为0; 原理如下: 如果某整数的最末位为1,那么减一后,最末位变成0; 如果某整数的最末位为0,那么减一后,最右边的1变成0,1左边的其余为保持不变,1右边的0全部变成1; 上述两种情况,减一前后整数相与的结果就是把原来的整数最右边的1以及1右边的其余位都变成0。 多次循环,每次都会把最右边的1变成0,循环次数就是1的个数。
#include<bits/stdc++.h>
using namespace std;
int main()
{ int n = 0,num;
unsigned int flag = 1;
cin>>num;
while(num)
{ num = num & (num - 1);
n++;
}
cout<<n;
}
|