有两种方法
1 使用lowbit()函数,自定义 lowbit函数是计算出一个二进制数的最后一个1及其后面的0的大小,比如111100,那么lowbit就是返回100,相当于是求1的个数
class Solution {
public:
int lowbit(int m) {
return m & -m;
}
int NumberOf1(int n) {
int res = 0;
while (n) {
res ++;
n -= lowbit(n);
}
return res;
}
};
2 输入的数据和1进行&,然后右移一位即可,注意要把int转化为无符号整数,因为如果是有符号整数,比如是负数的时候,二进制首位为1,当右移一位的时候,计算机会自动把符号位补全,所以永远也不会右移完全
class Solution {
public:
int NumberOf1(int n) {
unsigned int n1 = n;
int res = 0;
while (n1) {
res += n1 & 1;
n1 >>= 1;
}
return res;
}
};
如果题目是直接输入的unsigned int ,那么lowbit代码如下
class Solution {
public:
int lowbit(uint32_t m) {
return m & (-m);
}
int hammingWeight(uint32_t n) {
int res = 0;
while (n) {
res ++;
n -= lowbit(n);
}
return res;
}
};
右移的算法如下:
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while (n) {
res += (n & 1);
n >>= 1;
}
return res;
}
};