当输入 $2023$ 时,下列程序的输出结果为( )。
#include <iostream>
using namespace std;
int main() {
int x, ans = 0;
cin >> x;
while (x != 0) {
x -= x & -x;
ans++;
}
cout << ans << endl;
return 0;
}看到 x -= x & -x → 先想 Brian Kernighan 算法:每次消去最低位的 1。
混淆逻辑与位运算;误以为右移是算术右移导致负数处理错误。
考点:二进制表示|位运算
程序统计整数二进制中 1 的个数。x & -x 提取最低位 1,x -= x & -x 将其清零,循环次数即 1 的个数。