十六进制(hexadecimal,简称 hex)是基数 16:有十六个数字,0 到 9,再加 A 到 F。因为 16 = 24,所以一个十六进制数字正好是四位。十六进制只是更简短的二进制写法,并不是计算机另一种存储方式。
四位与一个十六进制数字怎样对应?
四位(一个 nibble)可以表示 0 到 15,正好是十六个十六进制数字。
| 十进制 | 二进制 | 十六进制 | 十进制 | 二进制 | 十六进制 |
|---|---|---|---|---|---|
| 0 | 0000 | 0 | 8 | 1000 | 8 |
| 1 | 0001 | 1 | 9 | 1001 | 9 |
| 2 | 0010 | 2 | 10 | 1010 | A |
| 3 | 0011 | 3 | 11 | 1011 | B |
| 4 | 0100 | 4 | 12 | 1100 | C |
| 5 | 0101 | 5 | 13 | 1101 | D |
| 6 | 0110 | 6 | 14 | 1110 | E |
| 7 | 0111 | 7 | 15 | 1111 | F |
这张表不必死记。二进制那一栏只是位值 8、4、2、1,你几秒钟就能重建任何一行。
怎样在二进制与十六进制之间转换?
二进制转十六进制:
- 把各位分成每四位一组,从右边开始。最后一组不足时,在左边补 0。
- 用 8、4、2、1 把每组转成 0 到 15 的数。
- 把每个数写成一个十六进制数字。
十六进制转二进制: 把每个十六进制数字换成它的四位。
十六进制转十进制: 左边的数字乘以 16,再加右边的数字。
示范例子
把 10111100 转成十六进制,再转成十进制。
第 1 步,分组: 1011 和 1100。
第 2 步,转换每组: 1011 = 8 + 2 + 1 = 11 = B。1100 = 8 + 4 = 12 = C。
第 3 步,十六进制答案: BC。
第 4 步,十进制: B 是 11,C 是 12,所以 11 × 16 + 12 = 176 + 12 = 188。
检查: 二进制 10111100 是 128 + 32 + 16 + 8 + 4 = 188。两条路线结果一致。
反过来,十六进制 3F 变成 0011 和 1111,二进制是 00111111。十进制是 3 × 16 + 15 = 63,而 32 + 16 + 8 + 4 + 2 + 1 也是 63。
可以用代码检查十六进制转换吗?
可以。在 Python 中,hex(188) 得到 '0xbc',int("BC", 16) 得到 188,format(188, "08b") 得到 10111100。可以在 Python 推理沙盒试一试。
用代码来验证你在纸上的做法,而不是取代它,因为考试要求你写出方法。
要留意的错误
常见的失误是位数不是 4 的倍数时,从左边开始分组。
题目: 把 1101101(7 位)转成十六进制。
错误做法: 从左边分组:1101 和 101,得到 D 和 5,答案 D5。
D5 的十进制是 213,但 1101101 是 64 + 32 + 8 + 4 + 1 = 109。应该从右边分组,并在左边补 0:0110 1101,也就是 6 和 13,所以是 6D。检查:6 × 16 + 13 = 109。
自我检查
1. 把十六进制 7E 转成二进制和十进制。
查看答案
7 = 0111,E = 14 = 1110,所以二进制是 01111110。十进制:7 × 16 + 14 = 112 + 14 = 126。检查:64 + 32 + 16 + 8 + 4 + 2 = 126。
2. 把 11110001 转成十六进制。
查看答案
分组:1111 和 0001。1111 = 15 = F,0001 = 1。答案是 F1。十进制是 15 × 16 + 1 = 241。
3. 说出程序员把 255 写成 FF 的一个理由。
查看答案
FF 代表 1111 1111,是 8 位的最大值(255)。它只需要 两个字符而不是八个,更短,读写和复制时也更不容易出错。
接下来学什么
接下来练习二进制加法并留意溢出,再用综合练习检验整个单元。如果你总在分组或 A 到 F 上出错,可以找线上一对一 Computer Science 补习的老师陪你练,直到转换不必再看表。