计算机组成原理:进位计数制与进制转换
文章目录
- 进位计数制
- 常见进制数
- 进制转换
- 任意进制 → 十进制
- 二进制 ↔ 八进制 | 十六进制
- 二进制 → 八进制
- 二进制 → 十六进制
- 八进制 → 二进制
- 十六进制 → 二进制
- 十进制 → 任意进制
- 除基取余(针对整数部分)
- 乘基取整(针对小数部分)
- 十进制 → 二进制
进位计数制
进位计数制是一种利用有限的数字符号通过进位来表示任意数值的方法。其核心思想是基于位权原则,每一位上的数值都与该位的权值相乘,然后将所有结果相加得到最终的实际数值。这种表示方法不仅简洁高效,而且便于计算机硬件实现和运算操作。
常见的进位计数制包括二进制、八进制、十进制和十六进制等。
常见进制数
在进位计数法中,每个数位所用到的不同数码的个数称为基数。十进制的基数为10(0~9),每个数位计满 10 就向高位进位,即“逢十进一”。十进制数 101,其个位的 1 显然与百位的 1 所表示的数值是不同的。
例如,十进制数 123 的各位权值分别为 100 → 10²
、10 → 10¹
和 1 → 10⁰
,其数值即为
1
×
100
+
2
×
10
+
3
×
1
=
123
1×100 + 2×10 + 3×1 = 123
1×100+2×10+3×1=123。
每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数,这个常数称为位权。一个进位数的数值大小就是它的各位数码按权相加。
d
表示数码,其下标比指明了该数码的位置
我们通过十进制数推广至任意进制数(例如二进制、八进制、十六进制)
-
二进制:计算机中用得最多的是基数为 2 的计数制,即二进制。二进制只有 0 和 1 两种数码,计数“逢二进一”。它的任意数位的权为 2 i 2^i 2i,i 为所在位数。
例如,二进制数
1011
的各位权值分别为8 → 2³
、4 → 2²
、2 → 2¹
和1 → 2⁰
。通过将每一位的数值与其权值相乘并求和,可以将其转换为十进制数 11。 -
八进制:基数为 8,有 0~7 共 8 个不同的数码。计数逢八进一。因为 r = 8 = 2 3 r=8=2^3 r=8=23,所以把二进制中的 3 位数码编为一组就是 1 位八进制数码,两者之间的转换极为方便。
例如,八进制数
37
的各位权值分别为8 → 8¹
和1 → 8⁰
,转换为十进制数为 3 × 8 + 7 × 1 = 31 3×8 + 7×1 = 31 3×8+7×1=31。 -
十六进制:基数为 16,有 09、AF 共 16 个不同的数码,其中 A~F 分别表示 10~15。计数逢十六进一。因为 r = 16 = 2 4 r=16=2^4 r=16=24,所以 4 位二进制数码与 1 位十六进制数码相对应。
例如,十六进制数
3A
的各位权值分别为16 → 16¹
和1 → 16⁰
,转换为十进制数为 3 × 16 + 10 × 1 = 58 3×16 + 10×1 = 58 3×16+10×1=58。
可以用后缀字母标识一个数的进位计数制,用 B
表示二进制,用 O
表示八进制,用 D
表示十进制(通常直接省略),用 H
表示十六进制,有时也用前缀 0x
表示十六进制数。
进制转换
任意进制 → 十进制
使用 按“权”展开法 完成 任意进制 → 十进制 的转换,我们可以将位权都统一到 2 的幂次,以方便计算。
-
确定每一位的权值:从右到左依次确定每一位的权值。
-
将每一位数字乘以其权值:将每一位的数字与其对应的权值相乘。
-
将所有乘积相加:将上述乘积相加,得到最终的十进制结果。
常用的 2 的幂次方数
二进制 ↔ 八进制 | 十六进制
-
使用 3 位二进制数来对应 1 位八进制数,也可以表达为 2 3 = 8 1 2^3 = 8^1 23=81,完成 二进制 ↔ 八进制 的转换
-
使用 4 位二进制数来对应 1 位十六进制数,也可以表达为 2 4 = 1 6 1 2^4 = 16^1 24=161,完成 二进制 ↔ 十六进制 的转换
转换时,不要忘记小数点
常用进制数对照表:
二进制 → 八进制
-
对于整数部分,从低位到高位,沿着向左的方向,每 3 位划分为 1 组,高位不足 3 位而无法划分为 1 组时,补充相应数量个 0 凑足 3 位,进而可划分为 1 组
-
对于小数部分,从高位到低位,沿着向右的方向,每 3 位划分为 1 组,低位不足 3 位而无法划分为 1 组时,补充相应数量个 0 凑足 3 位,进而可划分为 1 组
之后,将每组 3 位进制数转换成对应的八进制数即可
二进制 → 十六进制
-
对于整数部分,从低位到高位,沿着向左的方向,每 4 位划分为 1 组,高位不足 4 位而无法划分为 1 组时,补充相应数量个 0 凑足 4 位,进而可划分为 1 组
-
对于小数部分,从高位到低位,沿着向右的方向,每 4 位划分为 1 组,低位不足 4 位而无法划分为 1 组时,补充相应数量个 0 凑足 4 位,进而可划分为 1 组
之后,将每组 4 位进制数转换成对应的八进制数即可
八进制 → 二进制
将八进制数每个数位上的 1 位 八进制数转换为 3 位二进制数即可,若整数部分的最高位、小数部分的最低位为 0,将其去掉即可。
十六进制 → 二进制
将十六进制数每个数位上的 1 位 十六进制数转换为 4 位二进制数即可,若整数部分的最高位、小数部分的最低位为0,将其去掉即可。
十六进制数转换为八进制数(或八进制数转换为十六进制数)时,先将十六进制(八进制)数转换为二进制数,然后由二进制数转换为八进制(十六进制)数较方便。
十进制 → 任意进制
通过 除基取余,乘基取整 (注意,基数的值与进制相关)的方式完成 十进制 → 任意进制 的转换(也可以二进制数作为桥梁)
这种转换方法对十进制数的整数部分和小数部分将分别进行处理,对整数部分采用除基取余法,对小数部分采用乘基取整法,最后将整数部分与小数部分的转换结果拼接起来。
除基取余(针对整数部分)
整数部分除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位(除基取余,先余为低,后余为高),商为 0 时结束。
将按权展开形式中的整数部分除以基数 r
,得到的式子中的最后一项
d
0
r
\frac{d_0}{r}
rd0 中的
d
0
d_0
d0 就是余数,也是目标进制数整数部分的最低位
d
0
d_0
d0,其余部分为商。
将商继续除以基数 r
,得到的式子中的最后一项
d
1
r
\frac{d_1}{r}
rd1 中的
d
1
d_1
d1 就是新的余数,也是目标进制数整数部分自最低位起的第二位
d
1
d_1
d1,其余部分为新的商。
参照上述过程进行计算,直到商为 0 时结束,这就是除基取余的原理
以下是十进制整数分别转换为二进制、八进制、十六进制的示例:
乘基取整(针对小数部分)
小数部分乘基取整,最先取得的整数为数的最高位,最后取得的整数为数的最低位(乘基取整,先整为高,后整为低),乘积为10(或满足精度要求)时结束
将按权展开形式中的小数部分乘以基数 r
,得到的式子中的第一项
d
−
1
×
r
0
{d_{-1}}\times{r^0}
d−1×r0 中的 是整数,其取值范围取决于要转换成的目标进制(如二进制为 0-1,八进制为 0-7,十六进制为 0-15),而这个整数就是目标进制数小数部分的第一位,其余部分为小数 或 0。
将小数继续乘以基数 r
,得到的式子中的第一项
d
−
2
×
r
0
{d_{-2}}\times{r^0}
d−2×r0 中的 是整数,而这个整数就是目标进制数小数部分的第二位,其余部分为小数 或 0。
参照上述过程进行计算,直到小数为 0 或达到指定精度时结束,这就是乘基取整的原理。
以下是十进制小数分别转换为二进制、八进制、十六进制的示例:
在计算机中,小数和整数不一样,整数可以连续表示,但小数是离散的,所以并不是每个十进制小数都可以准确地用二进制小数表示。例如0.3,使用乘基取整时,无论经过多少次乘二取整转换都无法得到精确的结果,出现计算结果无限循环,导致无限循环小数的情况,此时我们只要达到所指定的要保留小数点后面的位数即可。但任意一个二进制小数都可以用十进制小数精确表示。
十进制 → 二进制
也可以使用 凑值法 完成十进制 → 二进制的转换