C 语言实例 – 二进制与十进制相互转换
你有没有想过,计算机是如何“读懂”我们输入的数字的?比如我们输入数字 10,计算机却用 1010 这样的形式来存储它。这种“翻译”过程,正是二进制与十进制之间的相互转换。作为 C 语言学习者,掌握这一基础技能,不仅有助于理解底层数据存储机制,还能在嵌入式开发、位运算、网络协议等领域大展身手。
今天,我们就通过几个典型的 C 语言实例,手把手带你实现二进制与十进制之间的相互转换。无论你是编程初学者,还是已经接触过 C 语言的中级开发者,相信都能从中获得启发。
为什么需要二进制与十进制转换?
在计算机世界里,所有数据都以二进制形式存在——0 和 1。我们日常使用的十进制(0~9)只是人类的习惯。举个形象的例子:就像我们用“公斤”来衡量重量,而计算机却用“克”一样,两者本质相同,只是表达方式不同。
二进制的每一位代表 2 的幂次:
- 第 0 位(最右):2⁰ = 1
- 第 1 位:2¹ = 2
- 第 2 位:2² = 4
- 第 3 位:2³ = 8
以此类推。
所以,十进制数 10 转换为二进制的过程就是:
10 = 8 + 2 = 2³ + 2¹ → 二进制表示为 1010。
反过来,二进制 1010 转换为十进制:
1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8 + 0 + 2 + 0 = 10。
这个过程虽然简单,但用 C 语言实现,却能锻炼你的逻辑思维和编程能力。
十进制转二进制:算法解析与代码实现
我们先从十进制转二进制开始。核心思想是“除以 2 取余”,直到商为 0。
举个例子:十进制数 13 转二进制
13 ÷ 2 = 6 余 1
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
将余数从下往上排列:1101 → 二进制结果
这个算法可以用 C 语言轻松实现。
#include <stdio.h>
// 函数:将十进制整数转换为二进制字符串
void decimalToBinary(int n) {
// 如果输入为 0,直接输出 0
if (n == 0) {
printf("0\n");
return;
}
// 用于存储二进制位的数组,最多 32 位(int 类型)
int binary[32];
int i = 0; // 用于记录当前存储位置
// 循环:每次除以 2,记录余数
while (n > 0) {
binary[i] = n % 2; // 余数是当前位的二进制值
n = n / 2; // 商作为下一次除法的被除数
i++; // 指针后移
}
// 从最后一个余数开始输出,即倒序打印
printf("二进制表示为:");
for (int j = i - 1; j >= 0; j--) {
printf("%d", binary[j]);
}
printf("\n");
}
int main() {
int num;
printf("请输入一个十进制整数:");
scanf("%d", &num);
decimalToBinary(num);
return 0;
}
✅ 代码说明:
binary[32]:数组大小设定为 32,因为 int 类型通常占 32 位,能覆盖所有情况。n % 2:取余操作,得到当前最低位的二进制值(0 或 1)。n / 2:整数除法,相当于右移一位。- 最后循环倒序输出,因为余数是从低位到高位记录的。
二进制转十进制:位权相加法详解
反过来,把二进制转十进制,核心是“按权展开”。每一位的值乘以对应的 2 的幂次,然后相加。
例如:二进制 1101
= 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1 = 13
在 C 语言中,我们可以用字符串形式输入二进制,然后逐位处理。
#include <stdio.h>
#include <string.h>
#include <math.h>
// 函数:将二进制字符串转换为十进制整数
int binaryToDecimal(char *binaryStr) {
int decimal = 0;
int len = strlen(binaryStr); // 获取字符串长度
// 从左到右遍历每一位(高位在前)
for (int i = 0; i < len; i++) {
// 检查是否为有效的二进制字符
if (binaryStr[i] != '0' && binaryStr[i] != '1') {
printf("错误:输入包含非二进制字符!\n");
return -1;
}
// 当前位的值(0 或 1)
int bit = binaryStr[i] - '0'; // 字符 '0' 转为整数 0,'1' 转为 1
// 权值:从高位开始,指数为 (len - 1 - i)
int power = len - 1 - i;
// 累加:bit × 2^power
decimal += bit * (int)pow(2, power);
}
return decimal;
}
int main() {
char binary[33]; // 最多 32 位 + 结束符 \0
printf("请输入一个二进制数(最多 32 位):");
scanf("%s", binary);
int result = binaryToDecimal(binary);
if (result != -1) {
printf("十进制结果为:%d\n", result);
}
return 0;
}
✅ 代码说明:
strlen(binaryStr):获取字符串长度,用于计算每一位的权重。binaryStr[i] - '0':这是将字符 '0'/'1' 转为整数 0/1 的常用技巧。pow(2, power):计算 2 的幂次,注意返回类型为 double,需强制转换为 int。- 错误处理:检测输入是否包含非法字符,增强程序健壮性。
实际案例:模拟计算器功能
我们来做一个小工具,让用户在十进制和二进制之间自由切换。这不仅能巩固知识,还能提升代码组织能力。
#include <stdio.h>
#include <string.h>
// 十进制转二进制
void decimalToBinary(int n) {
if (n == 0) {
printf("0\n");
return;
}
int binary[32];
int i = 0;
while (n > 0) {
binary[i++] = n % 2;
n /= 2;
}
printf("二进制:");
for (int j = i - 1; j >= 0; j--) {
printf("%d", binary[j]);
}
printf("\n");
}
// 二进制转十进制
int binaryToDecimal(char *bin) {
int len = strlen(bin);
int decimal = 0;
for (int i = 0; i < len; i++) {
if (bin[i] != '0' && bin[i] != '1') {
return -1;
}
int bit = bin[i] - '0';
int power = len - 1 - i;
decimal += bit * (int)pow(2, power);
}
return decimal;
}
int main() {
int choice;
char binary[33];
printf("=== 二进制与十进制转换工具 ===\n");
printf("1. 十进制转二进制\n");
printf("2. 二进制转十进制\n");
printf("请选择功能 (1 或 2):");
scanf("%d", &choice);
switch (choice) {
case 1: {
int num;
printf("请输入十进制数:");
scanf("%d", &num);
decimalToBinary(num);
break;
}
case 2: {
printf("请输入二进制数(最多 32 位):");
scanf("%s", binary);
int result = binaryToDecimal(binary);
if (result != -1) {
printf("十进制结果:%d\n", result);
}
break;
}
default:
printf("无效选择!\n");
}
return 0;
}
💡 使用建议:
- 编译命令:
gcc converter.c -o converter- 运行:
./converter- 输入测试:10 → 二进制 1010;1010 → 十进制 10
常见问题与调试技巧
在实现过程中,初学者常遇到以下问题:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 输出二进制顺序错误 | 余数从低位开始存储,未倒序输出 | 使用循环从数组末尾开始打印 |
| 二进制字符串无法识别 | 未做字符合法性检查 | 增加 if (c != '0' && c != '1') 判断 |
pow(2, n) 返回小数 |
pow 返回 double,需强制转换 |
(int)pow(2, power) |
| 数组越界 | 输入过长的二进制数 | 限制字符串长度为 32 |
总结与进阶建议
通过这篇 C 语言实例 – 二进制与十进制相互转换的教程,你已经掌握了:
- 十进制转二进制的“除 2 取余”算法
- 二进制转十进制的“按权展开”方法
- 如何用数组存储中间结果
- 如何处理输入验证与边界情况
这些技能不仅是面试常考题,更是理解位运算、数据结构和底层原理的基础。建议你:
- 尝试将程序改为支持负数(使用补码思想)
- 添加十六进制转换功能
- 将代码封装为库函数,提高复用性
编程的本质,就是把抽象的逻辑变成可运行的代码。每一次转换,都是你对计算机世界的又一次“翻译”。希望今天的实践,能让你在 C 语言的学习之路上,走得更稳、更远。