C语言 - 十进制转二进制
我们通常使用“除2取余,逆序排列”的方法来将十进制整数转换为二进制。
步骤如下:
-
将十进制数除以2,记录商和余数(余数只能是0或1)。
-
继续用上一步的商除以2,再次记录商和余数。
-
重复步骤2,直到商为0为止。
-
将得到的余数逆序排列,就是对应的二进制数。
例如,将十进制数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转换为二进制
13 ÷ 2 = 6 ... 余1 ↑
6 ÷ 2 = 3 ... 余0 ↑
3 ÷ 2 = 1 ... 余1 ↑
1 ÷ 2 = 0 ... 余1 ↑
从下往上读取余数:1101,所以13的二进制是1101
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:递归法
-
利用函数调用栈来"记住"余数
-
递归到最深层后依次输出余数
-
代码简洁但可能栈溢出
运行示例
请输入一个十进制整数: 13
转换结果:
方法1: 二进制: 1101
方法2: 二进制: 1101
方法3: 1101
常见问题
-
负数怎么办?
-
上述代码只处理正整数
-
负数需要使用补码表示,比较复杂
-
-
能转换的最大数是多少?
-
取决于使用的数据类型
-
对于int类型,通常是2^31-1
-
-
为什么二进制位是从右往左读?
-
最右边是最低位(2^0)
-
最左边是最高位
-

浙公网安备 33010602011771号