在C++中,位与运算符 & 用于对两个整数的二进制表示进行逐位与操作。对于每个二进制位,只有当两个操作数的对应位都是 1 时,结果的该位才是 1,否则是 0。
表达式 a &= (a - 1) 的作用是将整数 a 的二进制表示中最低位的 1 变为 0。这个操作的原理如下:
-
减法操作:
a - 1会将a的二进制表示中最低位的1变为0,并将其右边的所有0变为1。 -
与运算:将
a与a - 1进行与运算,结果会将a中最低位的1变为0,因为a - 1在这个位置是0,而其他位置保持不变,因为a和a - 1在其他位置的位都是相同的。
例子:
假设 a 的二进制表示为 101100(十进制为 44)。
-
减法操作:
a - 1的二进制表示为101011(十进制为43)。 -
与运算:
a & (a - 1)的结果为101000(十进制为40)。
可以看到,a & (a - 1) 的结果是将 a 的二进制表示中最低位的 1 变为 0。
作用:
这个操作在统计二进制表示中 1 的个数时非常有用。每次执行 a &= (a - 1),都会去掉 a 中的一个 1。因此,执行这个操作的次数就是 a 的二进制表示中 1 的个数。
代码示例:
cpp复制
#include <iostream>
using namespace std;
int main() {
unsigned int a;
cin >> a;
int num = 0;
// Brian Kernighan 算法
while (a > 0) {
a &= (a - 1); // 去掉最低位的1
num++;
}
cout << num << endl;
return 0;
}
总结:
a &= (a - 1) 是一个高效的位操作,可以用于统计二进制表示中 1 的个数,其时间复杂度为 O(k),其中

最低0.47元/天 解锁文章
484

被折叠的 条评论
为什么被折叠?



