专栏文章

浅谈不同进制的转换方法

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mino1t9d
此快照首次捕获于
2025/12/02 05:33
3 个月前
此快照最后确认于
2025/12/02 05:33
3 个月前
查看原文

一、进位计数制的概念

将数字符号顺序排列成数位,并按照某种由低位到高位的进位方式计数表示数值的方法,称为进位计数制

1.1 十进制

最常见的进位计数制,逢十进一,一般用于人的数学计算

1.2 二进制

计算机使用的进位计数制,逢二进一,因为二进制只有有( 1 )与无( 0 ),正好对应了晶体管计算机的亮与灭,所以对于计算机而言,二进制方便计算

1.3 其他进制

除了十进制与二进制,常用的还有八进制十六进制等。当进位计数制的进制位超过了 10 ,则用大写字母 A - Z 来代替 10 - 35 。
tips:一般情况(如生活、考试)进制位是不会超过 Z 的。

1.4 权

1.4.1 权的概念(定义)

进制中各位数字所表示的数值为该数的值乘数字所处位置的常数,这个常数就是“权”。特别的,小数位的权为负数
“权”在进制的转换中很重要,不可或缺

1.4.2 用“值乘权”表示一个数

举例:用“值乘权”的方式表示十进制数 1356213562
分析:在用“值乘权”的方式表示数时,我们首先需要列出这个数的每一位,再写出每位的权,最后表示出这个数。
正解:根据十进制数 1356213562 ,可列出下表:
万位千位百位十位个位
13562
104=1000010^4=10000103=100010^3=1000102=10010^2=100101=1010^1=10100=110^0=1
表示1×1041\times10^43×1033\times10^35×1025\times10^26×1016\times10^12×1002\times10^0
依据上表可得十进制数13562可以表示为: 1×104+3×103+5×102+6×101+2×1001\times10^4+3\times10^3+5\times10^2+6\times10^1+2\times10^0

二、十进制与其他进制的转换

2.1 十进制转二进制

在计算十进制转二进制时,我们一般采用“整除取余法”来把十进制转成二进制
:把十进制数 3535 转成二进制。
分析:在把十进制转成二进制时,我们需要不断地除二,求出每次的余数,再逆序把余数连起来,就是这个十进制数对应的二进制数。
正解如下
十进制转二进制例题解法

2.2 二进制转十进制

二进制转十进制只需要把二进制数用“值乘权”的方法表示处来,在正常用十进制算出结果,就是这个二进制数对应的十进制数。
再来个例题辅助理解: 把二进制数 1001011010010110 转成十进制数
分析:我们首先需要将 1001011010010110 表示为“值乘权”,再直接算出结果
正解(10010110)2=1×27+1×24+1×22+1×21=2+4+16+128=(150)10(10010110)_{2}=1\times2^7+1\times2^4+1\times2^2+1\times2^1=2+4+16+128=(150)_{10}

2.3 十进制与其他进制的转换

十进制与其他进制的转换方式一致,只需将上面( 2.1 、 2.2 )的二进制替换成对应进制再计算即可。

三、一些特殊进制直接转换的方法(重点)

在把一个非十进制数转成另一个非十进制数时,往往需要借助十进制进行“中转”,但有些特殊的进制,可以直接转换

3.1 八进制与二进制的转换

因为 8=238=2^3 ,所以在把八进制转成二进制时,我们可以将其划分成 33 位为一个部分,再将每部分转成二进制,最后连接在一起,就是其对应的二进制。
例题:把八进制数 13721372 转成二进制数。
分析:因为 8=238=2^3 ,所以可以从个位起,将 13721372 分成两个部分:(不足补 00001001372372,在将每部分转成二进制。
正解: 八进制数 13721372 可以按每3为一部分,分为 001001372372 。分别转成二进制是 111111101011111010 ,连起来是 111111010111111010。所以八进制数 13721372 转成二进制数是 111111010111111010

3.2 十六进制与二进制的转换

和上方( 3.3 )相似。因为 16=2416=2^4 ,所以在把十六进制转成二进制时,我们可以将其划分成 44 位为一个部分,再将每部分转成二进制,最后连接在一起,就是其对应的二进制。
例题:把十六进制数 1119A1119A 转成二进制数。
分析:因为 16=2416=2^4 ,所以可以从个位起,将 1119A1119A 分成两个部分:(不足补 0000010001119A119A ,在将每部分转成二进制。
正解: 十六进制数 1119A1119A 可以按每4为一部分,分为 00010001119A119A 。分别转成二进制是 1110001100110101000110011010 ,连起来是 1100011001101011000110011010 。所以十六进制数 13721372 转成二进制数是 1100011001101011000110011010

四、用C++实现进制转换与相关例题

例题1( 10 转 N 进制)

此题只是将 10 进制数转成别的进制,所以我们可以用 while 来模拟 2.1 中的连续带余除法,再判断余数,将其存入字符串,大于 10 转成大写字母,小于 10 直接存储,最后逆序输出
函数实现:
CPP
char c[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
void turn(int n,int a){
    int x[10000],i,j,k=0;
    if(n<0){  // 考虑负数
        cout<<"-";
    }
    j=abs(n);
    do{
        k++;
        i=j%a;
        j/=a;
        x[k]=i;
    }while(j!=0);
    for(int h=k;h>=1;--h){
        if(x[h]<10){  // 判断并输出
            cout<<x[h];  // 小于10
        }
        else{
            cout<<c[x[h]-10];  // 大于10
        }
    }
}
主函数的代码略,亲测 AC

例题2(十进制与二进制互转)

题目传送门:P1100 高低位交换
在此题中,我们可以将十进制数先转成二进制数,存入字符串并补 00 ,再直接互换高低位,最后转回十进制。
但此题还可以使用位运算直接转换,即 (((n & 0x0000ffff) << 16) | ((n & 0xffff0000) >> 16)) 即可将十进制数转二进制数进行操作在转回十进制。
整体代码略,亲测 AC

评论

0 条评论,欢迎与作者交流。

正在加载评论...