一组 n 位可以组成 2n 种不同的组合。凭这一条规则,你就知道若干位能表示多少个数字、字符或颜色,也知道一组项目需要几位。
这一课把二进制转换、溢出背后的上限和字符编码中的编码大小联系起来,是数字与文字的表示的最后一课。
为什么每多一位,值的数量就翻倍?
从小的开始,把每一种组合列出来。
| 位数 | 组合 | 数量 |
|---|---|---|
| 1 | 0, 1 | 2 |
| 2 | 00, 01, 10, 11 | 4 |
| 3 | 000, 001, 010, 011, 100, 101, 110, 111 | 8 |
| 4 | 上面 8 种前面加 0,再加上同样 8 种前面加 1 | 16 |
多加一位,每种旧组合就有两个版本:一个以 0 结尾,一个以 1 结尾。所以数量每次翻倍:2、4、8、16、32、64、128、256。这和二进制的位值是同一排数字,所以 8 位有 256 种组合,最大的数是 255。
怎样求一组项目需要几位?
- 数一数必须区分的项目有多少个。
- 找出最小的 n,使 2n 大于或等于这个数量。
- 写出 n,并展示检查:2n 够用,而 2n−1 不够。
示范例子
一个天气传感器会报告 12 种不同天气代码中的一种,例如晴、多云和雨。每个代码至少需要几位?
23 = 8,小于 12,所以 3 位不够。
24 = 16,不小于 12,所以 4 位够用。
答案是 4 位。16 种组合中有 4 种没有用到,这没有问题。
再看一个关于颜色的例子。一幅图像的颜色深度是每像素 8 位。可用颜色:28 = 256。
如果颜色深度提高到 24 位,颜色数量是 224 = 16 777 216。深度越大,颜色越丰富,但每个像素现在需要 24 位而不是 8 位,所以相同像素数下文件大三倍(24 ÷ 8 = 3)。
你可以在 Python 推理沙盒快速检查 2 的幂:print(2**8) 得到 256,print(2**24) 得到 16777216。
要留意的错误
常见的失误是把位数乘以 2,而不是用 2 的幂。
题目: 4 位可以表示多少个不同的值?
错误答案: 4 × 2 = 8。
这对 3 位是对的,对 4 位却不对。正确做法是 2 × 2 × 2 × 2 = 16。
第二种失误是把 8 位的最大数说成 256。组合有 256 种,但是从 0 开始,所以最大是 255。请把“有多少种组合?”和“最大的数是多少?”当成两个独立的问题。
自我检查
1. 6 位可以表示多少个不同的值?
查看答案
26 = 2 × 2 × 2 × 2 × 2 × 2 = 64。检查:32 的两倍是 64。
2. 一间图书馆用二进制给 40 个图书类别编码。每个编码最少需要几位?
查看答案
25 = 32 小于 40,所以 5 位太少。26 = 64 不小于 40。答案是 6 位。
3. 一幅图像有 16 种颜色。需要多大的颜色深度?如果再加一位,颜色数量会怎样?
查看答案
16 = 24,所以深度是 4 位。再加一位变成 5 位,颜色数量翻倍,变成 32。
接下来学什么
学到图像和声音如何存储时,位深度会再次出现,可以从 Computer Science 学习指南找到相关单元。用综合练习检验本单元的所有内容。
老师可以通过线上一对一 Computer Science 补习帮你把这些规则变成清晰、拿得到分的解释。