C语言十进制与二进制的相互转换

C/C++
411
0
0
2022-11-14

计算机只认识二进制数(0和1),因为计算机是机器,它由逻辑电路组成,而逻辑电路一般情况下有两种状态,这两种状态分别是开关的闭合和断开,逻辑电路的这两种状态刚好就对应了二进制的 "1" 和 "0” 。常见的进制数有二进制、八进制、十进制、十六进制。在不同的进制之间还可以相互转换,如:二进制转十进制,十进制转二进制等等。今天我来给大家分享如何运用C语言编写代码来实现进制数之间的互相转换。

认识进制数

二进制:用 0、1 表示,逢二进一。如 1、10、100等;

八进制:用 0 ~ 7 表示,逢八进一。如 1、7、11等;

十进制:用 0 ~ 9 表示,逢十进一。如 1、3、5等;

十六进制:用 0 ~ 9 、A~F,逢十六进一。如1A,2B,3C等;

十进制转换二进制

核心思路

将一个十进制数除二取余数,最后将余数逆序排列,就可以得到这个十进制数对应的二进制数了。举个简单的例子:

求十进制数75的二进制数:

75 ÷ 2 = 37 ······ 1

37 ÷ 2 = 18 ······ 1

18 ÷ 2 = 9 ······ 0

9 ÷ 2 = 4 ······ 1

4 ÷ 2 = 2 ······ 0

2 ÷ 2 = 1 ······ 0

1 ÷ 2 = 0 ······ 1

将上面的余数逆序排列,得到十进制数75的二进制数为1001011

那么,如何写代码呢?

通过上述的算术观察,发现取余的这个动作是重复的,因此,写代码时,我们可以用while循环做取余这个动作,其中,每次取余的余数可以用一个变量装起来。最难的就是逆序排列了,有人可能会想到用数组记下每一次取余的余数,最后倒序遍历数组输出余数,我觉得用数组复杂化了问题,当我们从上往下看余数,不难发现第一个余数对应的是二进制数的个位,而第二位余数对应的是二进制的十位数,依次类推,百位、千位等等,不妨再用一个变量i,每次取余的结果乘上i,而i每次循环乘10就能实现从个位进到十位了。

源代码展示

十进制转换二进制源代码如下:

#include <stdio.h>
int conversion(int decimalNumber);
int main()
{
    int number;
    printf("请输入一个十进制数:\n");
    scanf("%d",&number);
    printf("十进制数%d转二进制数为%d",number,conversion(number));
    return 0;
}
int conversion(int decimalNumber)
{
    int binaryNumber = 0,i=1;
    while(decimalNumber != 0)
    {
        binaryNumber += (decimalNumber % 2)*i;
        decimalNumber /= 2;
        i *= 10;
    }
    return binaryNumber;
}

运行编译输入一个十进制数75,输出以下结果:

十进制数75转换二进制数为1001011

二进制转换十进制

核心思路

从右到左将一个二进制数的每一位数乘以二的相应次方,然后就可以等得到这个二进制的十进制数了。举个简单的例子:

(1110)2 = 1 x 23 + 1 x 22 + 1 x 21 + 0 x 20 = 8 + 4 + 2 + 0 =14

那么,如何写代码呢?

将一个二进制数除以十取余得到二进制的个位数,然后利用C语言头文件 math.h 中的 pow(); 函数,将这个二进制的个位上的数乘以二的零次方,依次类推,二进制数的十位上的数乘以二的一次方,二进制数的百位上的数乘以二的二次方......不难发现,二进制数从右到左每隔一位上的数乘以二的某次方是有规律的,即每次乘完后,次方数都会加一。

源代码展示

二进制数转换十进制数源代码如下:

#include <stdio.h>
#include <math.h>
int conversion (long long binaryNumber);
int main()
{
    long long binaryNumber;
    printf("请输入一个二进制数:\n");
    scanf("%lld",&binaryNumber);
    printf("二进制数%lld转换十进制数为%d",binaryNumber,conversion(binaryNumber));
    return 0;
}
int conversion (long long binaryNumber)
{
    int decimalNumber = 0,i = 0,n;
    while(binaryNumber != 0)
    {
        n = binaryNumber % 10;
        binaryNumber /= 10;
        decimalNumber += n*pow(2,i);
        ++i;
    }
    return decimalNumber;
}

运行编译输入一个二进制数1110,输出以下结果:

二进制数1110转换十进制数为14