二进制、八进制、十进制以及十六进制之间的转换

在进行程序编程时,往往涉及到进制之间的转换,下面看看各进制之间是如何转换的。

1. 将二进制、八进制、十六进制转换为十进制

二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”。

假设当前是N进制,那么转换成十进制:

  • 对于整数部分,从右往左看,第i位的位权为N^{i-1}
  • 对于小数部分,恰好相反,要从左往右看,第j位的位权为N^{-j}

例如,将八进制数字7315.802转换成十进制:

        7315.802={\color{Red} 7*8^{3} + 3*8^{2} + 1*8^{1} +5*8^{0} +} {\color{Green} 8*8^{-1}+0*8^{-2}+2*8^{-3}} = 3790.00390625

再例如,将十六进制数字9FA8C转换成十进制:

        9FA8C = 9 * 16^{4} + 15 * 16^{3} + 10* 16^{2} + 8 * 16^{1} + 12 * 16^{0}=653964

将二进制转换成十进制类似:

        11010=1*2^{4} + 1*2^{3} + 0*2^{2} +1*2^{1} + 0*2^{0} = 26

2. 将十进制转换为二进制、八进制、十六进制

将十进制转换为其他进制时比较复杂,整数部分和小数部分的算法不一样。

(1)整数部分

        十进制整数转换为N进制整数采用“除N取余,逆序排列”法。具体做法:     

  • 将N作为除数,用十进制整数除以N,可以得到一个商和余数;
  • 保留余数,用商继续除以N,又得到一个新的商和余数;
  • ......
  • 如此反复进行,直到商为0。
  • 把得到的余数从后往前(从下往上)依次排列起来,就得到了N进制数字。

        例如,将十进制数字36926转换成八进制:

         

        从图中得知,十进制数字36926转换成八进制的结果为110076.

        下图演示了将十进制数字42转换成二进制的过程:

        

        从图中得知,十进制数字42转换成二进制的结果为101010.

(2)小数部分

        十进制小数转换成N进制小数采用“乘N取整,顺序排列”法。具体做法:

  • 用N乘以十进制小数,可以得到一个积,这个积包含了整数部分和小数部分;
  • 取出整数部分,继续用N乘以小数部分,又得到一个新的积;
  • ......
  • 如此反复进行,直到积中的小数部分为0,或者达到所要求的精度为止。
  • 把取出的整数部分从前往后(从上往下)按顺序排列起来,就得到了N进制小数。

        下图演示了将十进制小数0.930908203125转换成八进制小数的过程:

        

从图中得知,十进制小数0.930908203125转换成八进制小数的结果为0.7345.

下图演示了将十进制小数0.6875转换成二进制小数的过程:

 

从图中得知,十进制小数0.6875转换成二进制小数的结果为0.1011. 

3. 二进制、八进制和十六进制之间的转换

(1)二进制整数和八进制整数之间的转换

        二进制整数转换为八进制整数时,每三位二进制数字转换成一位八进制数字,运算的顺序是从低位向高位依次进行,高位不足三位用零补齐。下图演示了如何将二进制整数1110111100转换为八进制:

         

        从图中可以看出,二进制整数1110111100转换为八进制的结果为1674.

        八进制整数转换为二进制整数时,思路相反,每一位八进制数字转换为三位二进制数字,运算的顺序也是从低位向高位依次进行。下图演示了如何将八进制整数2743转换为二进制:

        

         从图中可以看出,八进制整数2743转换为二进制的结果为10111100011.

(2)二进制整数和十六进制整数之间的转换

        二进制整数转换为十六进制整数时,每四位二进制数字转换为一位十六进制数字,运算的顺序是从低位向高位依次进行,高位不足四位用零补齐。下图演示了如何将二进制整数 10 1101 0101 1100 转换为十六进制: 

  

        从图中可以看出,二进制整数 10 1101 0101 1100 转换为十六进制的结果为2D5C。

        十六进制整数转换为二进制整数时,思路相反,每一位十六进制数字转换为四位二进制数字,运算的顺序也是从低位向高位依次进行。下图演示了如何将十六进制整数A5D6转换为二进制:

        

        从图中可以看出,十六进制整数A5D6转换为二进制的结果为 1010 0101 1101 0110.

4. 代码

(1)十进制转换为k进制

#include<stdio>
#include<iostream>
#include<ctime>
char a[1000];
using namespace std;
int main()
{
    int y = 0, k, n, x;  //y为循环次数,n为商,x为要转换的进制数
    char z = 'A'; 
    scanf("%d %d", &n, &x);
    while(n != 0)        //判断商是否为0
    {
        y++;             //记录循环次数
        a[y] = n % x;    //取余
        n = n / x;
        if (a[y] > 9)
            a[y] = z + (a[y] -10);   //如果是16进制的10-15,转换成对应的字母
        else
            a[y] = a[y] + '0';
    }
    for (int i = y; i > 0; i--)
    {
        printf("%c", a[i]);           //从后往前按顺序排列,即为转换后的k进制数字
    }
    return 0;
}

(2)m进制转换为十进制

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
char a[10000];
using namespace std;
int main()
{
    int n, m;
    int f =0;
    scanf("%s%d", a, &m);
    for (int i = 0; i < strlen(a); i++)
    {
        f *= m;
        if (a[i] == 'A' || a[i] == 'B' || a[i] == 'C' || a[i] == 'D' || a[i] == 'E' || a[i] == 'F')
        {
            f = f + (a[i] - 'A' + 10);
        }
        else
        {
            f = f + (a[i] - '0');
        }
    }
    printf("%d", f);
    return 0;
}

更详细的代码可以参考博文:[c语言]进值转换的详细代码实现(二进制,十进制,十六进制等)_是小明同学啊的博客-CSDN博客_c语言十六进制转二进制计算机进制以及进制转换文章目录计算机进制以及进制转换计算机的多种进制:代码实现(正文):二进制转十进制:十进制转二进制:十六进制转十进制十进制转十六进制计算机的多种进制:今天给大家分享一下二进制,十进制,十六进制之间的转换,可谓是干货满满啊。 首先给大家简单介绍一下计算机领域常见的进制:二进制,八进制,十进制,十六进制。二进制:逢二进一,数字中只有0 和 1。其中S代表1个数码,k是数码的位置量,底数是2。八进制:逢八进一,数字中含有0,1,2,3,4,5,6,7。其中S代表1个数码https://blog.csdn.net/qq_51399192/article/details/120934844

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值