用 C 语言计算整数中的设置位

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在C编程中使用位运算来计算整数中设置位(1)的数量。本实验包括三个步骤:读取整数输入、使用位运算计算设置位的数量以及打印计数。完成本实验后,你将更好地理解数论和离散数学概念,以及如何在C编程中应用它们。

本实验首先演示如何从用户读取整数输入,这是位计数练习的第一步。然后,它引入了一个函数,该函数使用位运算来计算给定整数中设置位的数量。最后,程序向用户显示设置位的计数。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/while_loop("While Loop") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435171{{"用 C 语言计算整数中的设置位"}} c/operators -.-> lab-435171{{"用 C 语言计算整数中的设置位"}} c/while_loop -.-> lab-435171{{"用 C 语言计算整数中的设置位"}} c/user_input -.-> lab-435171{{"用 C 语言计算整数中的设置位"}} c/output -.-> lab-435171{{"用 C 语言计算整数中的设置位"}} end

读取整数

在这一步中,你将学习如何在C编程中读取整数输入以进行设置位计数。我们将创建一个简单的程序来演示整数输入。

首先,让我们为我们的位计数程序创建一个C源文件:

cd ~/project
nano bit_counter.c

现在,将以下代码添加到文件中:

#include <stdio.h>

int main() {
    int number;

    // 提示用户输入一个整数
    printf("输入一个整数:");

    // 读取整数输入
    scanf("%d", &number);

    // 显示输入的数字
    printf("你输入的是:%d\n", number);

    return 0;
}

让我们编译并运行该程序:

gcc bit_counter.c -o bit_counter
./bit_counter

示例输出:

输入一个整数:42
你输入的是:42

代码解释:

  • #include <stdio.h> 包含标准输入/输出库
  • scanf("%d", &number) 从用户读取整数输入
  • printf() 用于显示提示信息和输入的数字
  • %d 是整数的格式说明符

这个简单的程序演示了如何读取整数输入,这是我们设置位计数练习的第一步。

使用位运算计算1的个数

在这一步中,你将学习如何在C语言中使用位运算来计算整数中设置位(1)的数量。

让我们修改之前的bit_counter.c文件来实现位计数:

cd ~/project
nano bit_counter.c

用以下代码替换之前的内容:

#include <stdio.h>

// 使用按位与运算计算设置位的函数
int countSetBits(int number) {
    int count = 0;

    while (number) {
        // 检查最低有效位
        count += number & 1;

        // 将数字右移一位
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // 提示用户输入一个整数
    printf("输入一个整数:");
    scanf("%d", &number);

    // 计算并显示设置位的数量
    int setBitCount = countSetBits(number);
    printf("%d 中的设置位数量:%d\n", number, setBitCount);

    return 0;
}

编译并运行程序:

gcc bit_counter.c -o bit_counter
./bit_counter

示例输出:

输入一个整数:42
42 中的设置位数量:3

代码解释:

  • countSetBits()函数使用位运算来计算设置位的数量
  • number & 1检查最低有效位(如果位被设置则返回1,否则返回0)
  • number >>= 1将数字右移一位,移动到下一位
  • 循环继续直到所有位都被检查

位运算分解:

  • 42的二进制表示是101010
  • 位位置:1 0 1 0 1 0
  • 设置位计数:3

这种方法使用最少的计算步骤有效地计算了整数中1的数量。

打印计数结果

在这最后一步中,我们将改进我们的位计数程序,以提供更详细的输出,并演示打印设置位计数的不同方法。

让我们修改bit_counter.c文件,以添加更全面的打印功能:

cd ~/project
nano bit_counter.c

用以下实现更新代码:

#include <stdio.h>

// 使用按位与运算计算设置位的函数
int countSetBits(int number) {
    int count = 0;

    while (number) {
        count += number & 1;
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // 提示用户输入一个整数
    printf("输入一个整数:");
    scanf("%d", &number);

    // 计算设置位的数量
    int setBitCount = countSetBits(number);

    // 以多种格式打印计数结果
    printf("十进制数:%d\n", number);
    printf("二进制表示:");

    // 打印二进制表示
    for (int i = 31; i >= 0; i--) {
        int bit = (number >> i) & 1;
        printf("%d", bit);
    }
    printf("\n");

    // 打印设置位计数结果
    printf("设置位的数量:%d\n", setBitCount);
    printf("设置位的百分比:%.2f%%\n",
           (float)setBitCount / 32 * 100);

    return 0;
}

编译并运行程序:

gcc bit_counter.c -o bit_counter
./bit_counter

示例输出:

输入一个整数:42
十进制数:42
二进制表示:00000000000000000000000000101010
设置位的数量:3
设置位的百分比:9.38%

代码解释:

  • 添加了二进制表示的打印
  • 包含了设置位的百分比计算
  • 使用位运算提取各个位
  • 格式化输出以提供关于位计数的多个视角

该程序现在提供了整数位组成的全面视图,显示了:

  • 十进制值
  • 完整的32位二进制表示
  • 设置位的总数
  • 设置位的百分比

总结

在本实验中,你首先学习了如何在C编程中读取整数输入。这涉及使用scanf()函数捕获用户输入,并使用printf()函数显示输入的数字。接下来,你实现了一个名为countSetBits()的函数,该函数使用位运算来计算给定整数中设置位(1)的数量。此函数遍历数字的各个位,使用按位与运算检查最低有效位,然后将数字右移以移动到下一位。设置位的计数被累加并返回。