2.2 二、八、十、十六进制转换
上一节把数定义为“数字乘位权”的贡献之和。进制转换不会改变数值,只会改变描述这个数值所使用的符号。
例如:
这四种写法表示同一个数量。
选择转换路线
不同的源底数与目标底数适合不同工具。
路线 1:位权展开为十进制
直接使用位权定义:
十六进制数字 D 的贡献是十三乘所在位权,并不是十进制数字串 13。
霍纳方法可以从左到右完成相同计算:
这种形式很适合程序实现:不断把累计值乘以底数,再加上下一个数字。
路线 2:用比特分组转换八进制和十六进制
由于 ,恰好三个二进制位对应一个八进制数字。由于 ,恰好四个二进制位对应一个十六进制数字。
| 二进制组 | 八进制 | 二进制组 | 十六进制 |
|---|---|---|---|
000 | 0 | 0000 | 0 |
001 | 1 | 0001 | 1 |
010 | 2 | 0010 | 2 |
011 | 3 | 0011 | 3 |
100 | 4 | 1010 | A |
101 | 5 | 1100 | C |
110 | 6 | 1110 | E |
111 | 7 | 1111 | F |
转换十六进制时,从基数点向外每四位分为一组:
| 二进制分组 | 1010 | 0101 | 1100 |
|---|---|---|---|
| 十六进制数字 | A | 5 | C |
所以 。
转换八进制时,把同一串比特改为每三位一组:
| 二进制分组 | 101 | 001 | 011 | 100 |
|---|---|---|---|---|
| 八进制数字 | 5 | 1 | 3 | 4 |
所以 。
如果最左侧分组不足,可以补前导零。补零不会改变数值。
实验 1——把同一比特模式翻译为三种写法
切换 12 位比特区域,完成十六进制、八进制和十进制任务。实验会同时重新划分三位组与四位组,但底层比特始终是同一组。
完成任务后,分别切换最低位和最高位,比较两次产生的数值变化。
路线 3:十进制整数使用重复除法
把非负十进制整数转换为底数 :
1. 用 除当前数值;
2. 记录余数,它是下一个最低有效数字;
3. 用商继续计算;
4. 商为零时停止;
5. 按产生顺序的反方向读取余数。
把 转换为十六进制:
| 除法 | 商 | 余数 |
|---|---|---|
| 10 | 13 = D | |
| 0 | 10 = A |
第一个余数是低位,所以要从下向上读取:
再用位权展开检查:
数值零是一个边界情况。重复除法不会进行正数迭代,但零的表示仍然是 0。
实验 2——按正确方向装配余数
改变十进制输入与目标底数。车间会生成全部“商—余数”行,但需要你按照正确顺序选择余数卡片。
尝试一个转换结果含有重复数字的数。即使符号相同,每张余数卡仍然来自不同步骤。
转换小数部分
对于小数,重复乘法是重复除法的镜像。
把十进制小数 转换为底数 :
1. 计算 ;
2. 记录结果的整数部分,它是下一个从左到右的小数位;
3. 用新的小数部分继续。
把 转换为二进制:
| 乘法 | 整数数字 | 新的小数部分 |
|---|---|---|
| 1 | 0.25 | |
| 0 | 0.5 | |
| 1 | 0 |
所以 。
与整数余数不同,小数数字已经按照从高位到低位的顺序产生,不能再反转。
有些小数在目标底数中永远不会终止。定长系统必须在选定的位数后停止,并说明结果是近似值。
检查点
请选择能够提供检查方法的流程:
- 非十进制转十进制:展开位权;
- 十进制整数转底数 :重复除法并反向读取余数;
- 十进制小数转底数 :重复乘法并保持数字顺序;
- 二进制与八/十六进制互转:围绕基数点进行比特分组。
下一节会追问一个更深的问题:比特完成转换并存入机器后,最高位应当表示正位权,还是表示负号?