代码解析:阅读程序-1
我帮你把这段代码完整分析一下,逐步解释函数 f、g 的含义,以及 main 的执行逻辑。
1. 函数 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- 因为二进制中有 3 个 1。
2. 函数 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。
3. 主函数 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])并输出。
4. 举例运行
输入:
5
1 2 3 4 5
逐个分析:
a[0] = 1 (1₂)f(1) = 1g(1) = 1- 输出
2
a[1] = 2 (10₂)f(2) = 1g(2) = 2- 输出
3
a[2] = 3 (11₂)f(3) = 2g(3) = 1- 输出
3
a[3] = 4 (100₂)f(4) = 1g(4) = 4- 输出
5
a[4] = 5 (101₂)f(5) = 2g(5) = 1- 输出
3
输出结果:
2 3 3 5 3
✅ 总结:
f(x)= 二进制里 1 的个数g(x)= 最低位 1 的权值- 程序输出:每个输入数的
(1的个数 + 最低位1的权值)
