写leetcode遇到几个需要快速求二进制序列1的个数的题,故在此总结一下几种方法。
按位判断
这是最简单直观的方式,依次判断整数的每一位是否为 1 。
判断第 1 位:n & 1
判断第 2 位:n & (1 << 1)
判断第 n 位:n & (1<<(n-1))
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
for (int i = 0; i < 32; i ++) {
if (n & (1 << i)) {
ret ++;
}
}
return ret;
}
};
快捷方法:N & (N - 1)
使用这个方法,基于这样一个事实:
一个数 n 与一个比它小 1 的数(n−1)进行与运算(&)之后,得到的结果会消除 n 中最低位的 1
。
比如 :
7&6
00111 & 00110 =00110
可以看到,n&(n−1) 得到的结果,就是将 n 最低位 1 ,换成 0 之后的值。
每次都使用该运算法则消去 1 ,每运算一次计数器 +1,直至 n 为 0 。
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while (n) {
n = n&(n - 1);
res++;
}
return res;
}
};