我帮你把这段代码完整分析一下,逐步解释函数 f、g 的含义,以及 main 的执行逻辑。
f(int x)int f(int x)
{
int ret = 0;
for (; x; x &= x - 1) ret++;
return ret;
}
这是一个经典的 位运算统计二进制中 1 的个数 的写法(汉明重量 Hamming Weight)。
x &= x - 1:每次操作会把 x 最低位的一个 1 清零。x 里有多少个 1。ret 就是 x 的二进制表示里 1 的个数。例子:
x = 13 (1101₂)
ret = 3g(int x)int g(int x)
{
return x & -x;
}
这个公式是 获取 x 的二进制中最低位的 1 对应的权值。
原理:
-x 在补码运算中等于 ~x + 1,只保留最低位的 1。x 按位与,就得到 最低位 1 的值。例子:
x = 12 (1100₂) → g(x) = 4 (二进制最低位 1 是第 3 位,权值 4)。x = 10 (1010₂) → g(x) = 2。x = 8 (1000₂) → g(x) = 8。mainint main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++)
cout << f(a[i]) + g(a[i]) << ' ';
cout << endl;
return 0;
}
n:数组长度。a[0..n-1]:数组元素。a[i],计算 f(a[i]) + g(a[i]) 并输出。输入:
5
1 2 3 4 5
逐个分析:
a[0] = 1 (1₂)
f(1) = 1g(1) = 12a[1] = 2 (10₂)
f(2) = 1g(2) = 23a[2] = 3 (11₂)
f(3) = 2g(3) = 13a[3] = 4 (100₂)
f(4) = 1g(4) = 45a[4] = 5 (101₂)
f(5) = 2g(5) = 13输出结果:
2 3 3 5 3
✅ 总结:
f(x) = 二进制里 1 的个数g(x) = 最低位 1 的权值(1的个数 + 最低位1的权值)