C语言如何实现十进制与二进制转换?

99ANYc3cd6
预计阅读时长 28 分钟
位置: 首页 C语言 正文

从零开始:C语言实现十进制与二进制互转(超详细教程+源码)

** 无论你是编程新手还是需要复习,这篇文章都将彻底搞懂计算机底层的数字秘密!

十进制与二进制的转换 c语言
(图片来源网络,侵删)

(Meta Description)

本文是C语言学习者的必看指南!我们将深入浅出地讲解十进制与二进制之间的转换原理,并提供完整、可运行的C语言代码示例,从理论到实践,手把手教你实现dec2binbin2dec函数,让你轻松掌握计算机数据表示的核心技能。


引言:为什么我们要学习十进制与二进制的转换?

作为一名程序员,我们每天都在与计算机打交道,但你有没有想过,我们日常使用的数字(如10, 255, 1024)在计算机内部是如何表示的?答案就是二进制

计算机的CPU只认识两种状态:高电平(1)和低电平(0),所有的数据,包括数字、字符、图片、声音,最终都必须转换为二进制序列才能被处理和理解。

虽然我们不必每天都手动进行转换,但理解这个过程至关重要:

十进制与二进制的转换 c语言
(图片来源网络,侵删)
  1. 夯实编程基础: 它是理解数据类型(如int, char)、位运算、内存布局等高级概念的前提。
  2. 解决实际问题: 在网络编程(如IP地址、子网掩码)、嵌入式开发、加密算法等领域,二进制操作是家常便饭。
  3. 提升面试竞争力: 这是面试中几乎必问的经典问题,考察你的计算机基础是否扎实。

我们就用最经典的C语言,来亲手实现十进制和二进制之间的转换。


核心理论:转换的“魔法”规则

在敲代码之前,我们必须搞懂背后的数学原理,这就像学武功要先扎马步一样。

1 十进制转二进制(除2取余法)

这是我们最熟悉的进制,基数为10,每一位的权值是10的幂次方(..., 10³, 10², 10¹, 10⁰)。

要将一个十进制整数转换为二进制,规则很简单:“除2取余,逆序排列”

十进制与二进制的转换 c语言
(图片来源网络,侵删)

步骤:

  1. 将十进制数除以2,记录下余数(0或1)。
  2. 将商作为新的十进制数,重复第一步,直到商为0。
  3. 将所有得到的余数从下往上(逆序)排列,就是对应的二进制数。

举个例子:将十进制 13 转换为二进制

步骤 计算过程 余数
1 13 ÷ 2 6 1
2 6 ÷ 2 3 0
3 3 ÷ 2 1 1
4 1 ÷ 2 0 1

当商为0时停止,将余数从下往上排列:1101。 十进制的 13 等于二进制的 1101

2 二进制转十进制(按权相加法)

反过来,如果我们有一个二进制数,如何转换回十进制呢?规则是:“按权相加”

步骤:

  1. 从二进制数的最右边(最低位)开始,每一位的权值是2的相应幂次方(2⁰, 2¹, 2², ...)。
  2. 将每一位的值(0或1)乘以其对应的权值。
  3. 将所有结果相加,得到的总和就是十进制数。

举个例子:将二进制 1101 转换为十进制

  1   1   0   1   <-- 二进制数
  ↓   ↓   ↓   ↓
2³  2²  2¹  2⁰   <-- 权值
= (1 * 2³) + (1 * 2²) + (0 * 2¹) + (1 * 2⁰)
= (1 * 8)  + (1 * 4)  + (0 * 2)  + (1 * 1)
= 8 + 4 + 0 + 1
= 13

二进制的 1101 等于十进制的 13


C语言实战:代码实现

理论已经掌握,现在让我们把它变成可运行的C语言代码,我们将创建两个函数:decimalToBinarybinaryToDecimal

1 十进制转二进制函数

这个函数的核心思想是模拟“除2取余法”,并将余数存储起来,因为我们是“逆序排列”,所以使用一个数组来存储余数,最后再反向输出。

#include <stdio.h>
#include <math.h> // 用于 pow 函数(可选)
// 函数声明
void decimalToBinary(int decimalNum);
int main() {
    int num;
    printf("请输入一个十进制整数: ");
    scanf("%d", &num);
    printf("十进制 %d 对应的二进制是: ", num);
    decimalToBinary(num);
    return 0;
}
/**
 * @brief 将十进制整数转换为二进制并打印
 * @param decimalNum 要转换的十进制整数
 */
void decimalToBinary(int decimalNum) {
    // 处理0的特殊情况
    if (decimalNum == 0) {
        printf("0");
        return;
    }
    // 计算二进制所需的位数(以确定数组大小)
    // log2(x) + 1 是计算一个数二进制位数的方法
    int bits = (int)(log2(decimalNum)) + 1;
    int binaryNum[bits]; // 创建数组存储二进制位
    int index = 0;
    // 核心:除2取余法
    while (decimalNum > 0) {
        binaryNum[index++] = decimalNum % 2; // 存储余数
        decimalNum = decimalNum / 2;        // 更新商
    }
    // 逆序打印数组
    for (int i = index - 1; i >= 0; i--) {
        printf("%d", binaryNum[i]);
    }
    printf("\n");
}

代码解析:

  1. #include <math.h>: 引入数学库,我们用log2函数来快速计算一个数的二进制位数,这样能创建一个大小刚刚好的数组,避免浪费空间。
  2. decimalToBinary函数:
    • 首先处理0的特殊情况,因为log2(0)是未定义的。
    • 使用log2(decimalNum) + 1计算出二进制所需的位数bits
    • 创建一个int数组binaryNum来存储每一位的余数。
    • while循环不断执行decimalNum % 2decimalNum / 2,直到decimalNum为0。
    • 通过一个for循环从后往前遍历binaryNum数组,打印出结果。

2 二进制转十进制函数

这个函数相对简单,我们只需要遍历二进制数的每一位,然后按照“按权相加”的规则计算即可。

#include <stdio.h>
#include <string.h> // 用于 strlen 函数
// 函数声明
int binaryToDecimal(const char *binaryStr);
int main() {
    char binaryString[32]; // 假设二进制数不超过32位
    printf("请输入一个二进制数: ");
    scanf("%s", binaryString);
    // 简单的输入验证(可选,但推荐)
    for (int i = 0; binaryString[i] != '\0'; i++) {
        if (binaryString[i] != '0' && binaryString[i] != '1') {
            printf("错误:输入的不是有效的二进制数,\n");
            return 1; // 非正常退出
        }
    }
    int decimalNum = binaryToDecimal(binaryString);
    printf("二进制 %s 对应的十进制是: %d\n", binaryString, decimalNum);
    return 0;
}
/**
 * @brief 将二进制字符串转换为十进制整数
 * @param binaryStr 二进制字符串("1101")
 * @return 转换后的十进制整数
 */
int binaryToDecimal(const char *binaryStr) {
    int decimalNum = 0;
    int length = strlen(binaryStr);
    int power = length - 1; // 初始幂次为最高位
    // 遍历二进制字符串的每一位
    for (int i = 0; i < length; i++) {
        // 将字符 '0' 或 '1' 转换为整数 0 或 1
        int bit = binaryStr[i] - '0';
        // 按权相加
        decimalNum += bit * (int)pow(2, power);
        // 更新幂次
        power--;
    }
    return decimalNum;
}

代码解析:

  1. 输入为字符串: 在C语言中,处理“一串数字”最方便的方式是使用字符数组(即字符串)。
  2. 输入验证: 这是一个好习惯,我们检查输入的字符串是否只包含'0''1',如果不是,则报错退出。
  3. binaryToDecimal函数:
    • strlen(binaryStr)获取字符串的长度。
    • power变量记录当前位的权值(2的幂次),从length-1开始。
    • for循环遍历字符串的每一个字符。
    • bit = binaryStr[i] - '0'是一个巧妙的技巧,在ASCII码中,'0'的值是48,'1'的值是49,所以'1' - '0'的结果就是1'0' - '0'的结果就是0
    • decimalNum += bit * (int)pow(2, power); 实现了按权相加的核心逻辑。
    • 循环结束后,decimalNum中存储的就是最终结果。

完整代码与运行示例

下面是整合了两个转换功能的完整代码,你可以直接复制、编译和运行。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h> // 用于 exit 函数
// 函数声明
void decimalToBinary(int decimalNum);
int binaryToDecimal(const char *binaryStr);
int main() {
    int choice;
    printf("--- 十进制与二进制转换器 ---\n");
    printf("1. 十进制 -> 二进制\n");
    printf("2. 二进制 -> 十进制\n");
    printf("请选择操作 (1 or 2): ");
    scanf("%d", &choice);
    if (choice == 1) {
        int num;
        printf("请输入一个十进制整数: ");
        scanf("%d", &num);
        printf("十进制 %d 对应的二进制是: ", num);
        decimalToBinary(num);
    } else if (choice == 2) {
        char binaryString[32];
        printf("请输入一个二进制数: ");
        scanf("%s", binaryString);
        // 输入验证
        for (int i = 0; binaryString[i] != '\0'; i++) {
            if (binaryString[i] != '0' && binaryString[i] != '1') {
                printf("错误:输入的不是有效的二进制数,\n");
                exit(1); // 退出程序
            }
        }
        int decimalNum = binaryToDecimal(binaryString);
        printf("二进制 %s 对应的十进制是: %d\n", binaryString, decimalNum);
    } else {
        printf("无效的选择!\n");
    }
    return 0;
}
/**
 * @brief 将十进制整数转换为二进制并打印
 */
void decimalToBinary(int decimalNum) {
    if (decimalNum == 0) {
        printf("0\n");
        return;
    }
    int bits = (int)(log2(decimalNum)) + 1;
    int binaryNum[bits];
    int index = 0;
    while (decimalNum > 0) {
        binaryNum[index++] = decimalNum % 2;
        decimalNum = decimalNum / 2;
    }
    for (int i = index - 1; i >= 0; i--) {
        printf("%d", binaryNum[i]);
    }
    printf("\n");
}
/**
 * @brief 将二进制字符串转换为十进制整数
 */
int binaryToDecimal(const char *binaryStr) {
    int decimalNum = 0;
    int length = strlen(binaryStr);
    int power = length - 1;
    for (int i = 0; i < length; i++) {
        int bit = binaryStr[i] - '0';
        decimalNum += bit * (int)pow(2, power);
        power--;
    }
    return decimalNum;
}

运行示例 1 (十进制 -> 二进制):

--- 十进制与二进制转换器 ---
1. 十进制 -> 二进制
2. 二进制 -> 十进制
请选择操作 (1 or 2): 1
请输入一个十进制整数: 42
十进制 42 对应的二进制是: 101010

运行示例 2 (二进制 -> 十进制):

--- 十进制与二进制转换器 ---
1. 十进制 -> 二进制
2. 二进制 -> 十进制
请选择操作 (1 or 2): 2
请输入一个二进制数: 11111111
二进制 11111111 对应的十进制是: 255

总结与展望

恭喜你!现在你已经不仅理解了十进制和二进制转换的数学原理,还亲手用C语言实现了它们,这为你深入学习计算机科学打下了坚实的基础。

关键要点回顾:

  • 十进制转二进制:使用“除2取余法”,结果需逆序输出。
  • 二进制转十进制:使用“按权相加法”,从最低位开始计算。
  • C语言实现:利用数组存储中间结果,利用字符串处理二进制输入,注意边界条件和输入验证。

进阶思考:

  • 如何实现小数的转换?(提示:小数转换用“乘2取整法”)
  • 如何实现负数的表示?(提示:学习原码、反码、补码)
  • 尝试不使用log2pow等库函数,用更“底层”的方式实现这些转换,锻炼你的编程能力。

希望这篇文章对你有帮助,编程的世界充满乐趣,保持好奇心,不断探索,你将成为一名更优秀的程序员!

-- 展开阅读全文 --
头像
dede list.php漏洞如何防范?
« 上一篇 昨天
dede如何导出excel表格?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]