二进制转十进制 - 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语言实现方法!