1 of 2

代码解析:阅读程序-1

我帮你把这段代码完整分析一下,逐步解释函数 fg 的含义,以及 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) = 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的权值)

Scroll to Top