C语言 - 二进制转十进制
我们同样从原理出发,然后给出几种C语言的实现方法。
二进制转十进制的原理:将二进制数的每一位乘以2的相应次幂(从右往左,第0位是2^0,第1位是2^1,...),然后将这些乘积相加。
例如:二进制数1101转换为十进制
1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 8 + 4 + 0 + 1 = 13
注意:二进制数通常以字符串形式输入,因为如果以整数形式输入,我们很难逐位处理(尤其是前导0的情况)。
因此,我们将输入作为字符串处理。
步骤:
-
读取一个表示二进制数的字符串。
-
从字符串的左边(最高位)开始,每一位乘以2的(字符串长度-1-当前索引)次幂,然后累加。
例如:字符串"1101"
索引0: '1' -> 1 * 2^3
索引1: '1' -> 1 * 2^2
索引2: '0' -> 0 * 2^1
索引3: '1' -> 1 * 2^0
另一种思路:从左往右处理,每读一位,将当前结果乘以2,然后加上这一位的值。
例如:
初始结果=0
读到1:0*2+1 = 1
读到1:1*2+1 = 3
读到0:3*2+0 = 6
读到1:6*2+1 = 13
这种方法更高效,因为不需要计算幂次。
我们使用第二种方法。
注意:需要检查字符串中的每个字符是否是'0'或'1'。
下面用C语言实现:
二进制转十进制 - C语言教程
什么是二进制和十进制?
-
二进制:计算机使用的数字系统,只使用0和1两个数字
-
十进制:我们日常使用的数字系统,使用0-9这10个数字
转换原理:按权展开法
二进制数的每一位都有对应的权重(2的幂次),从右向左权重依次为2^0, 2^1, 2^2...
示例:将1101转换为十进制
1 1 0 1 ← 二进制位
↓ ↓ ↓ ↓
2^3 2^2 2^1 2^0 ← 权重
8 + 4 + 0 + 1 = 13
所以二进制1101等于十进制13
C语言实现代码
#include <stdio.h>
#include <string.h>
#include <math.h>
// 方法1:使用数学公式计算
int binaryToDecimal1(long long binary) {
int decimal = 0;
int base = 1; // 当前位的权重,初始为2^0=1
while (binary > 0) {
int lastDigit = binary % 10; // 获取最后一位
binary = binary / 10; // 去掉最后一位
decimal += lastDigit * base; // 累加当前位的值
base *= 2; // 权重乘以2,准备下一位
}
return decimal;
}
// 方法2:使用字符串处理(更灵活)
int binaryToDecimal2(char binary[]) {
int decimal = 0;
int length = strlen(binary);
for (int i = 0; i < length; i++) {
// 如果当前位是'1',则加上对应的权重
if (binary[i] == '1') {
decimal += pow(2, length - 1 - i);
}
// 如果是'0',什么都不做
// 如果有其他字符,说明输入错误
else if (binary[i] != '0') {
printf("错误:输入包含非二进制字符 '%c'\n", binary[i]);
return -1;
}
}
return decimal;
}
// 方法3:使用位运算思想(从字符串)
int binaryToDecimal3(char binary[]) {
int decimal = 0;
for (int i = 0; binary[i] != '\0'; i++) {
decimal = decimal * 2; // 相当于左移一位
if (binary[i] == '1') {
decimal = decimal + 1;
}
else if (binary[i] != '0') {
printf("错误:输入包含非二进制字符 '%c'\n", binary[i]);
return -1;
}
}
return decimal;
}
// 方法4:使用位运算(直接操作整数)
int binaryToDecimal4(long long binary) {
int decimal = 0;
int position = 0;
while (binary > 0) {
int bit = binary % 10; // 获取最后一位
if (bit == 1) {
decimal |= (1 << position); // 设置对应的位
}
else if (bit != 0) {
printf("错误:输入包含非二进制数字 %d\n", bit);
return -1;
}
binary /= 10; // 去掉最后一位
position++; // 移动到下一位
}
return decimal;
}
int main() {
int choice;
long long binaryNumber;
char binaryString[100];
printf("二进制转十进制转换器\n");
printf("请选择输入方式:\n");
printf("1. 输入整数形式的二进制数(如1101)\n");
printf("2. 输入字符串形式的二进制数(如\"1101\")\n");
printf("请选择(1或2): ");
scanf("%d", &choice);
if (choice == 1) {
printf("请输入二进制数: ");
scanf("%lld", &binaryNumber);
// 验证输入是否为有效的二进制数
long long temp = binaryNumber;
while (temp > 0) {
int digit = temp % 10;
if (digit != 0 && digit != 1) {
printf("错误:输入包含非二进制数字 %d\n", digit);
return 1;
}
temp /= 10;
}
printf("\n转换结果:\n");
printf("方法1(数学公式): %d\n", binaryToDecimal1(binaryNumber));
printf("方法4(位运算): %d\n", binaryToDecimal4(binaryNumber));
// 将整数转换为字符串,以便使用其他方法
sprintf(binaryString, "%lld", binaryNumber);
printf("方法2(字符串处理): %d\n", binaryToDecimal2(binaryString));
printf("方法3(累乘法): %d\n", binaryToDecimal3(binaryString));
} else if (choice == 2) {
printf("请输入二进制字符串: ");
scanf("%s", binaryString);
printf("\n转换结果:\n");
printf("方法2(字符串处理): %d\n", binaryToDecimal2(binaryString));
printf("方法3(累乘法): %d\n", binaryToDecimal3(binaryString));
} else {
printf("无效的选择!\n");
return 1;
}
return 0;
}
代码详解
方法1:数学公式法
-
从二进制数的最低位(最右边)开始处理
-
binary % 10获取当前最低位 -
base变量记录当前位的权重 -
每次循环权重乘以2,准备处理下一位
方法2:字符串处理法
-
直接处理二进制字符串
-
使用
pow(2, n)计算2的n次幂 -
从左到右处理,权重递减
-
可以检测非法字符
方法3:累乘法
-
从字符串左端开始处理
-
每次将当前结果乘以2,相当于左移
-
如果当前位是1,就加1
-
效率高,不需要计算幂次
方法4:位运算法
-
使用位操作符
|和<< -
1 << position创建对应位置的掩码 -
使用
|=来设置特定位
运行示例
二进制转十进制转换器
请选择输入方式:
1. 输入整数形式的二进制数(如1101)
2. 输入字符串形式的二进制数(如"1101")
请选择(1或2): 1
请输入二进制数: 1101
转换结果:
方法1(数学公式): 13
方法4(位运算): 13
方法2(字符串处理): 13
方法3(累乘法): 13
常见问题
-
如何验证输入是否为有效的二进制数?
-
检查每一位只能是0或1
-
方法2和3会自动检测非法字符
-
-
能处理多长的二进制数?
-
整数形式:受
long long类型限制(约19位) -
字符串形式:受数组大小限制,可以处理很长的二进制数
-
-
如果二进制数有前导零怎么办?
-
字符串形式:完全支持,如"001101"
-
整数形式:前导零会被自动去掉
-
-
哪种方法效率最高?
-
方法3(累乘法)通常效率最高
-
不需要计算幂次,只需要简单的乘法和加法
-
这个教程应该能帮助你理解二进制转十进制的原理和多种C语言实现方法!

浙公网安备 33010602011771号