C语言 - 十进制转二进制

我们通常使用“除2取余,逆序排列”的方法来将十进制整数转换为二进制。
步骤如下:

  1. 将十进制数除以2,记录商和余数(余数只能是0或1)。

  2. 继续用上一步的商除以2,再次记录商和余数。

  3. 重复步骤2,直到商为0为止。

  4. 将得到的余数逆序排列,就是对应的二进制数。

例如,将十进制数10转换为二进制:
10 / 2 = 5 ... 0
5 / 2 = 2 ... 1
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
然后逆序排列余数:1010,所以10的二进制表示为1010。

在C语言中,我们可以使用数组来存储余数,然后逆序输出数组。

注意:我们这里只考虑非负整数。

下面我们写一个程序,实现将用户输入的十进制整数转换为二进制。

 

十进制转二进制 - C语言教程

什么是十进制和二进制?

  • 十进制:我们日常使用的数字系统,使用0-9这10个数字

  • 二进制:计算机使用的数字系统,只使用0和1两个数字

转换原理:除2取余法

将十进制数不断除以2,记录每次的余数,直到商为0,然后将余数倒序排列。

示例:将13转换为二进制

text
13 ÷ 2 = 6 ... 余1 ↑
6  ÷ 2 = 3 ... 余0 ↑
3  ÷ 2 = 1 ... 余1 ↑
1  ÷ 2 = 0 ... 余1 ↑

从下往上读取余数:1101,所以13的二进制是1101

C语言实现代码

c
#include <stdio.h>

// 方法1:使用数组存储余数
void decimalToBinary1(int decimal) {
    int binary[32];  // 存储二进制位的数组
    int i = 0;
    
    // 处理0的特殊情况
    if (decimal == 0) {
        printf("二进制: 0\n");
        return;
    }
    
    // 不断除以2,记录余数
    while (decimal > 0) {
        binary[i] = decimal % 2;  // 求余数
        decimal = decimal / 2;    // 求商
        i++;
    }
    
    // 倒序输出余数
    printf("二进制: ");
    for (int j = i - 1; j >= 0; j--) {
        printf("%d", binary[j]);
    }
    printf("\n");
}

// 方法2:使用位运算(更高效)
void decimalToBinary2(int decimal) {
    printf("二进制: ");
    
    // 处理0的特殊情况
    if (decimal == 0) {
        printf("0\n");
        return;
    }
    
    // 找到最高位的1
    int mask = 1;
    while (mask <= decimal) {
        mask <<= 1;  // 左移一位,相当于乘以2
    }
    mask >>= 1;      // 回退到最高位
    
    // 从最高位开始输出
    while (mask > 0) {
        if (decimal & mask) {  // 检查该位是否为1
            printf("1");
        } else {
            printf("0");
        }
        mask >>= 1;  // 右移一位,相当于除以2
    }
    printf("\n");
}

// 方法3:递归实现
void decimalToBinary3(int decimal) {
    if (decimal > 1) {
        decimalToBinary3(decimal / 2);  // 递归调用
    }
    printf("%d", decimal % 2);  // 输出当前余数
}

int main() {
    int number;
    
    printf("请输入一个十进制整数: ");
    scanf("%d", &number);
    
    printf("转换结果:\n");
    
    printf("方法1: ");
    decimalToBinary1(number);
    
    printf("方法2: ");
    decimalToBinary2(number);
    
    printf("方法3: ");
    if (number == 0) {
        printf("0");
    } else {
        decimalToBinary3(number);
    }
    printf("\n");
    
    return 0;
}

代码详解

方法1:数组存储法

  • 使用数组binary[32]存储每一位的余数

  • decimal % 2获取当前最低位的值

  • decimal / 2相当于去掉当前最低位

  • 最后倒序输出数组内容

方法2:位运算法

  • 使用掩码(mask)来逐位检查

  • mask <<= 1左移找到最高位

  • decimal & mask检查特定位是否为1

  • 更接近计算机底层原理

方法3:递归法

  • 利用函数调用栈来"记住"余数

  • 递归到最深层后依次输出余数

  • 代码简洁但可能栈溢出

运行示例

text
请输入一个十进制整数: 13
转换结果:
方法1: 二进制: 1101
方法2: 二进制: 1101
方法3: 1101

常见问题

  1. 负数怎么办?

    • 上述代码只处理正整数

    • 负数需要使用补码表示,比较复杂

  2. 能转换的最大数是多少?

    • 取决于使用的数据类型

    • 对于int类型,通常是2^31-1

  3. 为什么二进制位是从右往左读?

    • 最右边是最低位(2^0)

    • 最左边是最高位

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