方法1:逐位计算(数学方法)
原理:二进制数的每一位代表2的幂次方,从右到左(最低位到最高位)依次是2^0, 2^1, 2^2, ...,将每一位的值乘以对应的2的幂次方,然后相加即可得到十进制数。

(图片来源网络,侵删)
步骤:
- 初始化结果为0。
- 从二进制数的最低位(最右边)开始遍历每一位。
- 对于每一位,如果该位是1,则将结果加上对应的2的幂次方。
- 移动到下一位(幂次方加1)。
代码示例:
#include <stdio.h>
#include <string.h> // 用于strlen函数
int binaryToDecimal(const char *binaryStr) {
int decimal = 0;
int length = strlen(binaryStr);
for (int i = 0; i < length; i++) {
if (binaryStr[i] == '1') {
decimal += (1 << (length - i - 1)); // 等价于2^(length-i-1)
}
}
return decimal;
}
int main() {
char binaryStr[] = "1010"; // 示例二进制数
int decimal = binaryToDecimal(binaryStr);
printf("二进制 %s 转换为十进制是: %d\n", binaryStr, decimal);
return 0;
}
输出:
二进制 1010 转换为十进制是: 10
方法2:使用标准库函数(strtol)
原理:C标准库提供了strtol函数,可以将字符串形式的二进制数转换为长整型十进制数。

(图片来源网络,侵删)
步骤:
- 使用
strtol函数,指定基数为2(表示二进制)。 - 处理可能的错误(如非法字符)。
代码示例:
#include <stdio.h>
#include <stdlib.h> // 用于strtol
#include <errno.h> // 用于错误处理
int main() {
char binaryStr[] = "1101";
char *endPtr;
long decimal;
errno = 0; // 重置错误标志
decimal = strtol(binaryStr, &endPtr, 2); // 基数为2
// 检查转换是否成功
if (errno != 0 || *endPtr != '\0') {
printf("输入的二进制数无效!\n");
return 1;
}
printf("二进制 %s 转换为十进制是: %ld\n", binaryStr, decimal);
return 0;
}
输出:
二进制 1101 转换为十进制是: 13
方法3:逐位处理(从左到右)
原理:从二进制数的最高位开始,逐步累加结果,每次将结果乘以2,然后加上当前位的值。

(图片来源网络,侵删)
步骤:
- 初始化结果为0。
- 遍历二进制数的每一位(从左到右)。
- 每次将结果乘以2,然后加上当前位的值(0或1)。
代码示例:
#include <stdio.h>
#include <string.h>
int binaryToDecimal(const char *binaryStr) {
int decimal = 0;
for (int i = 0; binaryStr[i] != '\0'; i++) {
decimal = decimal * 2 + (binaryStr[i] - '0');
}
return decimal;
}
int main() {
char binaryStr[] = "1111"; // 示例二进制数
int decimal = binaryToDecimal(binaryStr);
printf("二进制 %s 转换为十进制是: %d\n", binaryStr, decimal);
return 0;
}
输出:
二进制 1111 转换为十进制是: 15
| 方法 | 优点 | 缺点 |
|---|---|---|
| 逐位计算(数学) | 直观,适合理解原理 | 需要计算幂次方,效率稍低 |
strtol函数 |
代码简洁,适合生产环境 | 需要处理错误情况 |
| 逐位处理(左到右) | 效率高,无需额外计算 | 需要遍历整个字符串 |
根据实际需求选择合适的方法:
- 如果是学习或手动实现,推荐方法1或方法3。
- 如果是实际项目开发,推荐方法2(
strtol),因为它更简洁且高效。
