主题 1 · 数据表示
二进制、十进制与十六进制
计算机为什么用二进制计数,如何在二进制、十进制和十六进制之间转换,以及十六进制用在哪里。
为什么是二进制?
计算机由数十亿个叫作晶体管的微小开关组成。每个开关不是关就是开,所以最自然的存储方式就是只用两个数字:0 和 1。单个 0 或 1 叫作一个位(bit,binary digit)。
计算机处理的每一个数字、字母、声音和图片,都以位的组合来存储。数据必须先转换成二进制,计算机才能处理它。
核心概念: 二进制是以 2 为基数的。每一位的位值都是它右边一位的两倍:1、2、4、8、16、32、64、128。
位值
十进制(以 10 为基数)的位值是 1、10、100、1000。二进制同理,只是位值换成 2 的幂。读一个二进制数时,把下面写着 1 的那些位值加起来即可。
在下面试一试。点击任意一位来翻转它,看看十进制值如何变化。你能拼出 75 吗?(提示:64 + 8 + 2 + 1。)
00000000(0)到 11111111(255)。十进制转二进制
方法一,减去位值:从能放得下的最大位值开始,写 1,减掉它,再往右移。以 75 为例:64 放得下(剩 11),32 不行,16 不行,8 放得下(剩 3),4 不行,2 放得下(剩 1),1 放得下。所以 75 = 01001011。
方法二,除以 2:不断除以 2,记下每次的余数,再从下往上读余数。
| 数 | ÷ 2 | 余数 |
|---|---|---|
| 75 | 37 | 1 |
| 37 | 18 | 1 |
| 18 | 9 | 0 |
| 9 | 4 | 1 |
| 4 | 2 | 0 |
| 2 | 1 | 0 |
| 1 | 0 | 1 |
1001011,补足 8 位:01001011。十六进制
十六进制以 16 为基数。它使用数字 0–9,然后用字母 A–F 表示 10–15。一个十六进制数字正好对应 4 位(半字节),所以一个字节总是两个十六进制数字。
二进制转十六进制时,从右往左每 4 位分一组,再把每组分别转换。反过来,就把每个十六进制数字还原成它的 4 位。
1011 0111 → B(11)和 7 → B7。换成十进制是 11 × 16 + 7 = 183。十六进制与十进制互转
十六进制的位值是 16 的幂:1、16、256、4096。所以 1F4 = 1 × 256 + 15 × 16 + 4 × 1 = 500。
要把十进制转成十六进制,考试里最快的路线通常是十进制 → 二进制 → 十六进制。以 500 为例:0001 1111 0100 → 1F4。
| 十进制 | 二进制 | 十六进制 |
|---|---|---|
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 12 | 1100 | C |
| 15 | 1111 | F |
| 16 | 0001 0000 | 10 |
| 255 | 1111 1111 | FF |
十六进制用在哪里
十六进制比二进制短,人更容易读写,也更少出错。你会在这些地方见到它:
- HTML 颜色代码,例如
#FF8800(红 FF、绿 88、蓝 00)。 - MAC 地址,例如
00-1A-2B-3C-4D-5E。 - 错误代码和内存转储,例如
0x0000007B。 - IPv6 地址,例如
2001:0db8::ff00:0042。 - URL,其中
%20是空格的十六进制代码。
注意: 十六进制只是人类书写二进制的一种方式,计算机底层存储的仍然是二进制。
关键术语
- 位(bit)
- 一个二进制数字,0 或 1。
- 半字节(nibble)
- 4 位,对应一个十六进制数字。
- 字节(byte)
- 8 位,对应两个十六进制数字。
- 十进制
- 以 10 为基数,人们日常使用的数制。
- 十六进制
- 以 16 为基数,使用 0–9 和 A–F。
自我检测
把 10010110 转换成十进制。查看答案
128 + 16 + 4 + 2 = 150。
把 200 转换成 8 位二进制。查看答案
200 = 128 + 64 + 8 → 11001000。
把 3C 转换成二进制和十进制。查看答案
3 → 0011,C → 1100,所以是 00111100。十进制:3 × 16 + 12 = 60。
说出程序员用十六进制代替二进制的两个理由。查看答案
它更短,更容易阅读和记忆,输入时也更少出错;而且它能直接转换成二进制。