进制转换
不同的进制
在计算机中,除二进制外,比较常用的还有八进制和十六进制。
进制 | 基数 | 进位原则 | 基本符号 |
---|---|---|---|
二进制(B) | 2 | 逢2进1 | 0,1 |
八进制(O) | 8 | 逢8进1 | 0~7 |
十进制(D) | 10 | 逢10进1 | 0~9 |
十六进制(H) | 16 | 逢16进1 | 0 ~ 9,A ~ F |
Warning!
易错点:十六进制中的 A 相当于十进制中的 10。
进制转换
1. 十进制转化成K进制
(1)整数部分
短除法,除K取余,直到商是0,余数从下到上输出,即为K进制的整数部分。
例:十进制199转化成八进制

(2)小数部分
乘K取整,直到小数部分是0或达到指定精度,整数部分从上到下输出,即为K进制的小数部分。
例:十进制0.3125转化成八进制

Warning!
绝大部分浮点数无法用二进制精确表示,如 0.10。
2. K进制转化成十进制
每一位上的数字乘以对应的位权,整数部分位权是K(数位−1),小数部分的权分别为K−1、K−2 ……
千位 | 百位 | 十位 | 个位 | . | 十分位 | 百分位 | |
---|---|---|---|---|---|---|---|
数字 | 2 |
0 |
3 |
2 |
. | 1 |
2 |
位权 | K3 |
K2 |
K1 |
K0 |
. | K−1 |
K−2 |
例:八进制2032.12转换成十进制
(2032.12)8=2×83+0×82+3×81+2×80+1×8−1+2×8−2=(1050.15625)10
负数次幂
8−1=1/8=0.125
8−2=1/(82)=0.015625
3. 二、八、十六进制之间的转换
一个八进制位可以用 3 个二进制位来表示(23=8),一个十六进制位可以用 4 个二进制位来表示(24=16),反之同理。
十进制 | 二进制 | 八进制 | 十六进制 | 十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 8 | 1000 | 10 | 8 |
1 | 1 | 1 | 1 | 9 | 1001 | 11 | 9 |
2 | 10 | 2 | 2 | 10 | 1010 | 12 | A |
3 | 11 | 3 | 3 | 11 | 1011 | 13 | B |
4 | 100 | 4 | 4 | 12 | 1100 | 14 | C |
5 | 101 | 5 | 5 | 13 | 1101 | 15 | D |
6 | 110 | 6 | 6 | 14 | 1110 | 16 | E |
7 | 111 | 7 | 7 | 15 | 1111 | 17 | F |
例:(111100101110)2=(7456)8=(F2E)16
🌰 程序实现将n进制数转换成m进制。
cpp
//将n进制数字num,转换成m进制数
//(其中2 <= n,m <= 16,n进制数对应的十进制的值不超过int范围)
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
string num;
cin >> n >> num >> m;
//n进制num转换成十进制数ans
int ans = 0, w = 1;
int len = num.length();
for (int i = len - 1; i >= 0; i--){
if ('A' <= num[i] && num[i] <= 'F'){
ans = ans + (num[i] - 'A' + 10) * w;
} else {
ans = ans + (num[i] - '0') * w;
}
w *= n;
}
//十进制数ans转换成m进制
char mnum[100] = {}, cnt = 0;
while (ans != 0){
int tmp = ans % m;
if (tmp >= 10){
mnum[cnt++] = tmp - 10 + 'A';
}else{
mnum[cnt++] = tmp + '0';
}
ans /= m;
}
for (int i = cnt - 1; i >= 0; i--){
cout << mnum[i];
}
return 0;
}
为华盛达学员同步建设博客。(“我是一条狗,叫了一百年,也没能把中国叫醒”。----马相伯)