题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
这个题是一个很简单的题,利用位操作即可。但是鉴于很少有人用bitset类来解决问题,所以整理到此文中。
下面的方法1是基于bitset类求解的方案,直接实例化一个与int等大小的bitset变量,然后赋值,利用内置统计函数count返回结果。
关于bitset类,我之前的博文位变量中有较详细的介绍。
-
方法1:bitset方法
简单粗暴易懂。
class Solution {
public:
int NumberOf1(int n) {
bitset<sizeof(n) * 8> bn;
bn = n;
return bn.count();
}
};
-
方法2:移位法
一位一位移动并统计,容易理解,循环次数过多。
class Solution {
public:
int NumberOf1(int n) {
int nB = sizeof(n);
int mask = 0x01;
int sum = 0;
for (int i = 0; i < nB * 8; i++) {
if (n&mask)
sum++;
n >>= 1;
}
return sum;
}
};
-
方法3:相与法(最优)
最高效的法子,通过n = n&(n - 1)每次消除位为1的最低位,二进制中有多少个1就循环多少次;
无论正数还是负数,在机器中进行n-1的效果是相同的。
class Solution {
public:
int NumberOf1(int n) {
int sum = 0;
while (n) {
sum++;
n = n&(n - 1);
}
return sum;
}
};
网友评论