二进制转十进制 - C语言教程
什么是二进制和十进制?
二进制:计算机使用的数字系统,只使用0和1两个数字
十进制:我们日常使用的数字系统,使用0-9这10个数字
转换原理:按权展开法
二进制数的每一位都有对应的权重(2的幂次),从右向左权重依次为2^0, 2^1, 2^2...
示例:将1101转换为十进制
text
1 1 0 1 ← 二进制位
↓ ↓ ↓ ↓
2^3 2^2 2^1 2^0 ← 权重
8 + 4 + 0 + 1 = 13
所以二进制1101等于十进制13
C语言实现代码
c
#include
#include
#include
// 方法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创建对应位置的掩码
使用|=来设置特定位
运行示例
text
二进制转十进制转换器
请选择输入方式:
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语言实现方法!