二进制到十进制的编程实现主要通过逐位计算每一位的权重并累加完成。以下是两种常见的实现方式:
一、基于字符数组的迭代实现(推荐)
通过读取用户输入的二进制字符串,从右向左逐位计算其对应的十进制值。
```c
include include include int binaryToDecimal(const char *binary) { int decimal = 0; int base = 1; int len = strlen(binary); for (int i = len - 1; i >= 0; i--) { int digit = binary[i] - '0'; if (digit != 0 && digit != 1) { printf("输入的不是二进制数!n"); return -1; } decimal += digit * base; base *= 2; } return decimal; } int main() { char binary; printf("输入一个二进制数: "); scanf("%s", binary); int result = binaryToDecimal(binary); if (result != -1) { printf("十进制数为: %dn", result); } return 0; } ``` 说明: 1. 使用`scanf`读取二进制字符串,`strlen`获取长度。 2. 从右向左遍历字符串,将每一位转换为数字并计算其权重(2的幂次)。 3. 若输入包含非0或1字符,程序会提示错误并退出。 二、基于位运算的优化实现 通过位运算直接处理二进制数,效率更高。 ```c int binaryToDecimal(unsigned int n) { int decimal = 0; while (n > 0) { int digit = n & 1; // 获取最低位 decimal += digit * (1 << (sizeof(n) * 8 - __builtin_clz(n))); // 计算权重 n >>= 1; // 右移一位 } return decimal; } int main() { unsigned int binary; printf("输入一个二进制数: "); scanf("%u", &binary); printf("十进制数为: %dn", binaryToDecimal(binary)); return 0; } ``` 说明: 1. 使用`unsigned int`存储二进制数,避免符号位影响计算。 2. `n & 1`获取最低位(0或1)。 3. `1 << (sizeof(n) * 8 - __builtin_clz(n))`计算当前位的权重,`__builtin_clz`为GCC内置函数,计算前导零的位数。 4. 通过右移操作逐位处理。 三、递归实现(高级用法) 通过递归解析二进制字符串,适用于特定格式(如以``分隔)。 ```c include include int change(char *binary, int *sum, int *m) { if (*binary == '') { return *sum + pow(2, *m - *sum); } (*m)++; return change(binary + 1, sum, m); } int main() { char binary; printf("请输入二进制数(以开始与结束): "); scanf("%s", binary); int sum = 0, m = 0; int result = change(binary, &sum, &m); printf("十进制数为: %dn", result); return 0; } ``` 说明: 1. 输入需以``开头和结尾,例如`101`。 2. 递归函数逐位解析,遇到``时计算当前权重并累加。 总结:以上三种方法均可实现二进制到十进制的转换,选择时可根据需求权衡输入格式、效率及代码复杂度。迭代和位运算方法更通用,递归方法适用于特定场景。