我帮你把这段代码完整分析一下,逐步解释函数 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 = 3
g(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
。main
int 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) = 1
g(1) = 1
2
a[1] = 2 (10₂)
f(2) = 1
g(2) = 2
3
a[2] = 3 (11₂)
f(3) = 2
g(3) = 1
3
a[3] = 4 (100₂)
f(4) = 1
g(4) = 4
5
a[4] = 5 (101₂)
f(5) = 2
g(5) = 1
3
输出结果:
2 3 3 5 3
✅ 总结:
f(x)
= 二进制里 1 的个数g(x)
= 最低位 1 的权值(1的个数 + 最低位1的权值)