专栏文章
浅谈不同进制的转换方法
算法·理论参与者 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 用“值乘权”表示一个数
举例:用“值乘权”的方式表示十进制数 。
分析:在用“值乘权”的方式表示数时,我们首先需要列出这个数的每一位,再写出每位的权,最后表示出这个数。
正解:根据十进制数 ,可列出下表:
| 位 | 万位 | 千位 | 百位 | 十位 | 个位 |
|---|---|---|---|---|---|
| 值 | 1 | 3 | 5 | 6 | 2 |
| 权 | |||||
| 表示 |
依据上表可得十进制数13562可以表示为:
二、十进制与其他进制的转换
2.1 十进制转二进制
在计算十进制转二进制时,我们一般采用“整除取余法”来把十进制转成二进制
例:把十进制数 转成二进制。
分析:在把十进制转成二进制时,我们需要不断地除二,求出每次的余数,再逆序把余数连起来,就是这个十进制数对应的二进制数。
正解如下:

2.2 二进制转十进制
二进制转十进制只需要把二进制数用“值乘权”的方法表示处来,在正常用十进制算出结果,就是这个二进制数对应的十进制数。
再来个例题辅助理解:
把二进制数 转成十进制数
分析:我们首先需要将 表示为“值乘权”,再直接算出结果
正解:
2.3 十进制与其他进制的转换
十进制与其他进制的转换方式一致,只需将上面( 2.1 、 2.2 )的二进制替换成对应进制再计算即可。
三、一些特殊进制直接转换的方法(重点)
在把一个非十进制数转成另一个非十进制数时,往往需要借助十进制进行“中转”,但有些特殊的进制,可以直接转换。
3.1 八进制与二进制的转换
因为 ,所以在把八进制转成二进制时,我们可以将其划分成 位为一个部分,再将每部分转成二进制,最后连接在一起,就是其对应的二进制。
例题:把八进制数 转成二进制数。
分析:因为 ,所以可以从个位起,将 分成两个部分:(不足补 ) 和 ,在将每部分转成二进制。
正解:
八进制数 可以按每3为一部分,分为 和 。分别转成二进制是 和 ,连起来是 。所以八进制数 转成二进制数是 。
3.2 十六进制与二进制的转换
和上方( 3.3 )相似。因为 ,所以在把十六进制转成二进制时,我们可以将其划分成 位为一个部分,再将每部分转成二进制,最后连接在一起,就是其对应的二进制。
例题:把十六进制数 转成二进制数。
分析:因为 ,所以可以从个位起,将 分成两个部分:(不足补 ) 和 ,在将每部分转成二进制。
正解:
十六进制数 可以按每4为一部分,分为 和 。分别转成二进制是 和 ,连起来是 。所以十六进制数 转成二进制数是 。
四、用C++实现进制转换与相关例题
例题1( 10 转 N 进制)
题目传送门: B3849 [GESP样题 三级] 进制转换
此题只是将 10 进制数转成别的进制,所以我们可以用 while 来模拟 2.1 中的连续带余除法,再判断余数,将其存入字符串,大于 10 转成大写字母,小于 10 直接存储,最后逆序输出
函数实现:
CPPchar 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 高低位交换
在此题中,我们可以将十进制数先转成二进制数,存入字符串并补 ,再直接互换高低位,最后转回十进制。
但此题还可以使用位运算直接转换,即
(((n & 0x0000ffff) << 16) | ((n & 0xffff0000) >> 16)) 即可将十进制数转二进制数进行操作在转回十进制。整体代码略,亲测 AC 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...