Brian Kernighan 算法
Brian Kernighan 算法
我们可以使用 Brian Kernighan 算法进行优化,具体地,该算法可以被描述为这样一个结论:记 f(x) 表示 x 和 x−1 进行与运算所得的结果(即 f(x)= x & (x−1)),那么 f(x) 恰为 x 删去其二进制表示中最右侧的 1 的结果。基于该算法,当我们计算 s=x⊕y,只需要不断让 s=f(s),直到 s=0 即可。这样每循环一次,s 都会删去其二进制表示中最右侧的 1,最终循环的次数即为 s 的二进制表示中 1 的数量。
class Solution {
public: int countOnes(int x) {
int ones = 0;
while (x > 0)
{
x &= (x - 1);
ones++;
}
return ones;
}
vector<int> countBits(int n) {
vector<int> bits(n + 1);
for (int i = 0; i <= n; i++)
{ bits[i] = countOnes(i); }
return bits;
}
};