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的情况)。

因此,我们将输入作为字符串处理。

步骤:

  1. 读取一个表示二进制数的字符串。

  2. 从字符串的左边(最高位)开始,每一位乘以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转换为十进制

text
1    1    0    1    ← 二进制位
↓    ↓    ↓    ↓
2^3  2^2  2^1  2^0  ← 权重
8  + 4  + 0  + 1   = 13

所以二进制1101等于十进制13

C语言实现代码

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创建对应位置的掩码

  • 使用|=来设置特定位

运行示例

text
二进制转十进制转换器
请选择输入方式:
1. 输入整数形式的二进制数(如1101)
2. 输入字符串形式的二进制数(如"1101")
请选择(1或2): 1
请输入二进制数: 1101

转换结果:
方法1(数学公式): 13
方法4(位运算): 13
方法2(字符串处理): 13
方法3(累乘法): 13

常见问题

  1. 如何验证输入是否为有效的二进制数?

    • 检查每一位只能是0或1

    • 方法2和3会自动检测非法字符

  2. 能处理多长的二进制数?

    • 整数形式:受long long类型限制(约19位)

    • 字符串形式:受数组大小限制,可以处理很长的二进制数

  3. 如果二进制数有前导零怎么办?

    • 字符串形式:完全支持,如"001101"

    • 整数形式:前导零会被自动去掉

  4. 哪种方法效率最高?

    • 方法3(累乘法)通常效率最高

    • 不需要计算幂次,只需要简单的乘法和加法

这个教程应该能帮助你理解二进制转十进制的原理和多种C语言实现方法!

posted @ 2025-09-28 15:51  [BORUTO]  阅读(82)  评论(0)    收藏  举报