输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
算法思路:
方法一:用n&1,如果是为1则代表最后一位是1,计算完让n>>1,判断前一个数
方法二:一个数和该数减1后做按位与操作再赋给该数,即某数=某数&(某数-1),每执行一次,该数二进制最右边的1就会丢掉。那么我们便可以知道,只要一个数在变成0之前能执行多少次某数=某数&(某数-1)操作,该数的二进制便有多少个1。
#include <iostream>
#include <cstdlib>
#include <bitset>
#include <iomanip>
using namespace std;
//方法一:
int numOf1(int m)
{
int i = 0;
int num = 0;
for (i = 0; i < 32; i++)
{
if (((m >> i) & 1) == 1)
{
num++;
}
}
return num;
}
//方法二:
int numOf1(int m, int n)
{
int num = 0;
while (m)
{
m = m & (m - 1);
num++;
}
return num;
}
int main()
{
int n = -1;
cout << bitset<32>(n) << endl;
cout << numOf1(n) << endl;
cout << numOf1(n,1) << endl;
return 0;
}