---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "编码 隐匿在计算机软硬件背后的语言"
author: null
edition: null
publisher: null
year: null
isbn: "9787121181184"
library_document_id: "38270854-596f-4a26-8183-db8c968c6020"
source_sha256: "249786274d83909f0bddc34d77f81ed8f0b14d1eac8843c772a37a3ecbfe2cfc"
pdf_physical_page_count: 438
pdf_physical_page_index_base: 0
range_start: 90
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=90&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=90&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=80&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=100&limit=10"
---

# 编码 隐匿在计算机软硬件背后的语言

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=90 | PRINTED_PAGE=74

表示英军从陆路入侵。如果两盏灯都被点亮：

表示英军正由海路入侵。

每一盏提灯都代表一个比特。点亮的提灯表示比特值为1；未点亮的提灯表示比特值为0。托尼·奥兰多已经向我们证明了传送只有两种可能性的信息只需要一个比特。如果保罗·里威尔只需要被告知英军将要入侵（而不管他们将从何处入侵），一盏提灯就足够了。这盏提灯亮起表示入侵，不亮则表示今夜无事。

要表达包含三种可能性的消息，则还需要再加一盏提灯。如果有了第二盏提灯，这两盏提灯在一起可以表达四种可能的信息：

00 = 英军今晚不会入侵

01 = 英军正由陆路入侵

10= 英军正由陆路入侵

11 = 英军正由海路入侵

保罗·里威尔将三种可能性用两盏提灯来传送的做法事实上是相当老道的。用通信理论的术语来说，他运用了“冗余”（redundancy）来抵消噪声的影响。通信理论中，噪声（noise）是指影响通信效果的所有事物。电话线上的静电就是一个影响电话通信的鲜明例子。然而，电话通信通常都能成功，因为即使存在噪声，语音中仍存在大量的冗余。我们要理解对方的意思，并不需要听清对方所说的每个词的每个音节。

在上述例子中，噪声是指黑夜中暗淡的光线以及保罗·里威尔距钟楼的距离，这两个因素都能让他分辨不出点亮的是哪盏提灯。以下就是朗福罗诗中至关重要的一段：

哦！他站在与钟楼等高的位置观察，

一丝摇曳的微光，接下来，有一盏灯亮了！

他跳上马鞍，调转马头，

编码——隐匿在计算机软硬件背后的语言

74

## PDF_PHYSICAL_PAGE_INDEX=91 | PRINTED_PAGE=75

徘徊、凝视，直到看清所有的灯，

钟楼上的第二盏也灯亮了起来！

那当然不是说保罗·里威尔正在分辨到底是哪盏灯先亮的问题。

这里最本质的概念就是，信息是指多个可能性中的一种。例如，当我们与一个人交谈的时候，我们所说的每个字都是对字典中所有字的一个选择。如果我们将所有字典中的字从1到351482编号，我们可以用数字准确地进行交谈，而无需使用单词。（当然，交谈双方都需要有一本字典，字典上标注着每个数字所代表的是什么字，并且他们还需要有足够的耐心。)

换句话说，所有可以被转换成对两种或多种可能性的选择的信息，都可以用比特来表示。不用说，人类有很多形式的交流是不能用对非此即彼的可能性的选择来表示的，但这些交流形式对我们人类的生存又是至关重要的。这就是人类为什么没有与计算机之间建立起浪漫的关系的原因（无论如何，我们都希望这种情况不会发生）。如果你无法用语言、图画或声音来表达某种事物的时候，你就也无法将这个信息用比特的形式来编码。当然，你也不会想去这么做。

竖起拇指或者不竖起拇指就是一个比特的信息。两个人是否竖起拇指——就如影评人罗杰·艾伯特和刚去世不久的珍妮·西斯科对新影片给出他们的评价时那样—传达了两个比特的信息(我们且不论他们对电影所做了什么评价；我们所关心的只是他们的拇指)。这里有四种可能性，可以用两个比特位来表示：

00= 他们都不喜欢这部电影

01=西斯科讨厌它，艾伯特喜欢它

10=西斯科喜欢它，艾伯特讨厌它

11 = 他们都喜欢这部电影

第一个比特位表示西斯科的意见，为0表示西斯科讨厌这个部电影，为1表示喜欢。同样的，第二位表示艾伯特的意见。

因此，如果你的朋友问你：“对于电影Impolite Encounter，西斯科和艾伯特的评论如何？”你不必回答“西斯科翘起了大拇指，艾伯特却没有。”或者“西斯科喜欢这部电影，而艾伯特不喜欢。”你可以简短地回答：“一零。”只要你的朋友知道哪一位表示西斯科的意见，哪一位表示艾伯特的意见，并且知道1表示竖起拇指，0表示没有，你的回答就会很容易理解。但是，前提是你和你的朋友都知道编码的含义。

9 二进制数

75

## PDF_PHYSICAL_PAGE_INDEX=92 | PRINTED_PAGE=76

我们也可以一开始就声明值为1的比特位表示没有竖起拇指，值为0的比特位表示竖起了，这可能有点违反常规。通常我们会认为值为1的比特表示赞成，而值为0的比特则表示反对，但是实际上这是可以任意调换的。只要每个使用代码的人知道0和1都具体表示什么意义即可。

某一位或一连串比特位所表示的意义通常是和上下文有关的。系在一棵橡树上的黄色丝带可能仅仅是对于把它系在那里的人和希望在那里看到它的人才有意义。改变丝带的颜色、系丝带的树或者系丝带的日期，它就可能成为一块没有任何意义的破布。同样，想从西斯科和艾伯特的手势中得到有用的信息，我们至少需要知道他们讨论的是哪部电影。

如果你保留了一份西斯科和艾伯特对于电影的评价和投票结果，你就可以在反映他们意见的比特信息中再添加一个比特位，来表示你自己的看法。添加第三个比特位将使得其代表的信息可能性扩展到8种：

000=西斯科讨厌它，艾伯特讨厌它，我讨厌它

001=西斯科讨厌它，艾伯特讨厌它，我喜欢它

010=西斯科讨厌它，艾伯特喜欢它，我讨厌它

011=西斯科讨厌它，艾伯特喜欢它，我喜欢它

100=西斯科喜欢它，艾伯特讨厌它，我讨厌它

101=西斯科喜欢它，艾伯特讨厌它，我喜欢它

110=西斯科喜欢它，艾伯特喜欢它，我讨厌它

111=西斯科喜欢它，艾伯特喜欢它，我喜欢它

利用二进制表示信息的一个额外的好处就是我们可以清楚地知道我们是否已经想到了所有的可能性。我们知道在这种情况下有且仅有8种可能性，不多也不少。如果用3个比特位，只能从0数到7，后面不会再有其他的三位二进制数存在了。

在描述西斯科和艾伯特意见的比特位中，你可能一直在考虑一个非常重要而且令人不安的问题，这个问题就是：对于李纳德·马丁的“电影及电视指南”我们该怎么办呢？毕竟李纳德·马丁不用手指来评价电影，他用的是一种更传统的星级系统来评价。

编码—隐匿在计算机软硬件背后的语言

76

## PDF_PHYSICAL_PAGE_INDEX=93 | PRINTED_PAGE=77

要想知道需多少个马丁比特，首先必须了解这个系统的一些情况。马丁给电影的评价是1\~4颗星，并且中间可以有半颗星，为了好玩，实际上他不会给电影只评一颗星，而是用“BQMB（炸弹)”来代替。这里总共有7种可能性，也就意味着我们可以用三个比特位来表示某个评价等级了：

$$
\begin{array} { l } { 0 0 0 = \mathrm { B O M B } } \\ { 0 0 1 = \star 1 / 2 } \\ { 0 1 0 = \star \star } \\ { 0 1 1 = \star \star 1 / 2 } \\ { 1 0 0 = \star \star \star } \\ { 1 0 1 = \star \star \star 1 / 2 } \\ { 1 1 0 = \star \star \star \star } \end{array}
$$

你可能会问：“111呢？”在这里，这个编码不代表任何意义。它没有定义。如果二进制代码111被用来表示马丁的评价，那么你就会知道一定是出错了（计算机有可能会出现这样的错误，因为人不会给出这样的评分)。

之前提到过，当我们用两个比特位来表示西斯科和艾伯特的评价时，左边一位表示的是西斯科的意见，右边一位表示的则是艾伯特的意见。在上述马丁的评分系统中，每个单独的比特位都有确定的意义吗？是的，当然有。如果将比特码的数值加2，再除以2，我们就得到了马丁评分中对应的星星的数量。但这仅仅是由于我们以一种合乎人们对数字含义体验的方式定义了编码。我们同样也可以将编码作如下定义：

$$
\begin{array} { l } { 0 0 0 = \star \star \star } \\ { 0 0 1 = \star 1 / 2 } \\ { 0 1 0 = \star \star 1 / 2 } \\ { 0 1 1 = \star \star \star } \\ { 1 0 1 = \star \star \star } \\ { 1 1 0 = \star \star \star 1 / 2 } \\ { 1 1 0 = \star \star } \\ { 1 1 1 = \star 0 \mathrm { M B } } \end{array}
$$

只要每个人都明白它的意义，这个编码就与先前的编码同样有效。

如果马丁遇到了一部甚至连一颗星都不值得给的电影，他会给出半颗星。他也当然会有足够的编码来表示半星选项。此时，编码会像下面这样定义：

9 二进制数

77

## PDF_PHYSICAL_PAGE_INDEX=94 | PRINTED_PAGE=78

但是，如果他遇到了一部连半颗星都不值得给的电影，他就决定给它没有星的级别(ATOMIC BOMB？)，这时他就得再添加一个比特位了。因为已经没有三个比特位的代码可以用了。

《娱乐周刊》杂志常常举行一些评级活动，评级的对象除了电影之外还有电视节目、CD、书籍、CD-ROM、网站等其他一些东西。等级的范围是从A+\~F（尽管似乎只有波利·舒尔的电影才能堪此殊荣)。计算一下，一共有13个可能的等级。我们需要用4个比特位来表示这些等级。

$$
\begin{array} { r l } & { \mathsf { m o n } = \mathbf { F } } \\ & { \mathsf { m o n } = \mathbf { N } . } \\ & { \mathsf { m o n } = \mathbf { D } . } \\ & { \mathsf { m o n } = \mathbf { D } . } \\ & { \mathsf { m o n } = \mathbf { D } . } \\ & { \mathsf { o n } = \mathbf { C } . } \\ & { \mathsf { o n } = \mathbf { C } . } \\ & { \mathsf { o n } = \mathbf { D } . } \\ & { \mathsf { o n } = \mathbf { D } . } \\ & { \mathsf { m o n } = \mathbf { B } . } \\ & { \mathsf { I n o m } = \mathbf { B } . } \\ & { \mathsf { I n o m } = \mathbf { B } . } \\ & { \mathsf { I n o m } = \mathbf { A } . } \\ & { \mathsf { I n o m } = \mathbf { A } . } \end{array}
$$

这里我们有3个编码没有用到，即1101，1110和1111，加上这3个总共有16个编码。

无论何时我们谈到比特，通常所指的都是一定数目的比特位。我们拥有的比特位数

编码隐匿在计算机软硬件背后的语言

78

## PDF_PHYSICAL_PAGE_INDEX=95 | PRINTED_PAGE=79

越多，所能表示的不同可能性就越多。

当然，在十进制中也是同样的道理。例如，电话号码的区号有多少位呢？区号共有3位十进制数，如果所有的区号都使用的话（实际上我们并没有都使用，但这里不考虑这个问题)，一共就会有 ${ \mathfrak { l } } 0 ^ { 3 }$ ，即1000个号码，即000\~999。区号是212的7位电话号码会有多少种可能呢？ $1 0 ^ { 7 }$ ，即10,000,000个。区号是212，并且以260开头的电话号码会有多少个呢？ $1 0 ^ { 4 }$ ，即10,000个。

类似的，在二进制中，可能有的编码数等于2的整数次幂，其幂指数就是比特位的位数。

每增加一个比特位就会将编码的数量增加一倍。

如果已知所要用到编码的数量，如何计算需要多少比特位呢？换句话说，在上表中，如何才能由码字数反推出比特位数呢？

所要用到的方法叫做以2为底的对数运算，对数运算是指数运算的逆运算。我们知道2的7次幂等于128。那么以2为底的128的对数就是 $7 \textdegree$ 用数学符号来表示：

$$
2 ^ { 7 } = 1 2 8
$$

等价于：

$$
\mathbf { l o g } _ { 2 } \mathbf { l } 2 8 = 7
$$

因此，如果以2为底的128的对数是7，以2为底256的对数就是 ${ \mathfrak { z } } _ { \circ }$ 那么，以2为底200的对数是多少呢？大约是7.64，但实际上并不需要知道具体的值。如果我们要用二进制来表示200种不同的事物，共需要8个比特位。

9 二进制数

79

## PDF_PHYSICAL_PAGE_INDEX=96 | PRINTED_PAGE=80

比特通常无法从日常观察中找到，它深藏于电子设备中。我们看不到压缩磁盘(CD)、数字手表或计算机中被编码的比特，但有时比特也会清晰地呈现在我们眼前。

下面就是一个例子。如果你有一台相机是使用35毫米胶片的，观察一下它的卷轴。这样拿住胶卷：

你可以看到像国际象棋棋盘那样银黑交错排列的方格，这些方格在图中已经用数字1\~12进行了标注。这叫做DX编码，这12个方格实际上是12个比特位。一个银色的方格代表值为1的比特，一个黑色的方格代表值为0的比特。方格1和方格7通常是银色的（代表1)。

这些比特代表什么意思呢？你可能会知道，有些胶片比其他胶片对光更敏感些。这种对光的敏感程度称做胶片速度。人们会说某种对光非常敏感的胶片“很快”，那是因为这种胶片的曝光速度极快。胶片的曝光速度是由美国标准协会 ASA（American StandardsAssociation）来制定等级的。最常用的等级有100、200和400。ASA等级不仅以十进制数字的形式印在胶卷的外包装和暗盒上，它还以比特的形式进行了编码。

胶卷总共有24个ASA等级，它们是：

编码—隐匿在计算机软硬件背后的语言

80

## PDF_PHYSICAL_PAGE_INDEX=97 | PRINTED_PAGE=81

$$
\begin{array} { c c c } { { 1 6 0 0 } } & { { \quad 2 0 0 0 } } & { { \quad 2 5 0 0 } } \\ { { } } & { { } } & { { } } \\ { { 3 2 0 0 } } & { { \quad 4 0 0 0 } } & { { \quad 5 0 0 0 } } \end{array}
$$

要对ASA等级进行编码需要多少个比特位呢？答案是5个。我们知道 $2 ^ { 4 }$ 是16，比24要小。 $2 ^ { 5 }$ 是32，而这个数又超过了所需的码字数。

与胶片速度对应的比特值如下表所示。

大多数现代的35毫米照相机胶片都使用这些码字（除了那些要手动进行曝光的相机和具有内置式测光表但需要手动设定曝光速度的相机以外)。如果你观察一下照相机内部放胶卷的地方，就会发现在胶卷筒内部有6个金属的触点，对应着胶片的金属方格（1\~6号)。银色方格实际上是胶卷暗盒中的金属，即导体；涂有颜料的黑色方格，是绝缘体。

9 二进制数

81

## PDF_PHYSICAL_PAGE_INDEX=98 | PRINTED_PAGE=82

照相机中的电路产生一个电流流入方格1，方块1通常是银色的。这支电流有可能流经（也可能未流经）方格2\~6上的5个触点，这取决于方格是纯银还是涂有颜料的。这样，如果照相机在触点4和触点5上检测到了电流，而在触点2、3和6上却没有检测到，那么这个胶片的速度就是400ASA。这样，照相机就可以据此来调整胶片的曝光时间了。

假设胶片速度是50、100、200或400ASA，那么廉价的相机就只需读取方格2和方格3上的电流。

多数照相机不需要读取或使用方格8\~12。方格8、9和10被用来对这卷胶卷进行编码，方格11和方格12指出曝光范围（exposurelatitude)，这取决于胶片是用于黑白冲洗、彩色冲洗，还是做彩色幻灯片。

也许最常见的二进制数的表现形式就是无所不在的通用产品代码（UPC，UniversalProduct Code)，这个小条形码出现在差不多我们日常所购买的所有商品的包装上。UPC已经成为计算机逐步进入人们日常生活的标志之一。

尽管UPC经常会使人们瞎猜疑，但是它其实是无辜的。使用它的初衷仅仅是为了实现零售业的结算和存货管理的自动化，而且它在这方面的应用也很成功。当UPC与一个设计精巧的结账系统结合使用时，顾客会得到一张逐项开列的消费清单，这点是传统的现金出纳员所无法做到的。

有趣的是，UPC也是二进制码，尽管乍看起来它并不太像。将UPC解码并看看UPC到底是怎样工作的，就明白了。

在最常见的形式中，UPC是由30条不同宽度的垂直黑色条纹组成的，它们的间隔宽度也不同，条纹下面标有数字。例如，以下是Campbell公司出品的103/4盎司的罐装鸡汁面汤包上的UPC。

编码隐匿在计算机软硬件背后的语言

82

## PDF_PHYSICAL_PAGE_INDEX=99 | PRINTED_PAGE=83

我们要试着将条形码形象地看成是细条和黑条、窄间隙和宽间隙的排列，事实上，这就是观察条形码的一种方式。在UPC中，黑色条纹有四种不同的宽度，宽条纹的宽度分别是最细条纹宽度的两倍、三倍或四倍。同样，宽间隔的宽度分别是最窄间隔宽度的两倍、三倍或四倍。

但是，另一种解读UPC的方式就是将它们看做一列比特位。记住整个条形码不是在收银台的扫描仪所“看到”的那样。扫描仪所读到的并不是下面一排的数字，因为这需要更精密的光学识别（OCR，Optical Character Recognition）技术。扫描仪只识别整个条形码的一条窄带，条形码做得很大是为了便于结算台的操作人员用扫描仪对准。扫描仪所看到的那一个UPC断面可以这样表示：

看起来与莫尔斯码很像，不是吗？

当计算机从左向右扫描这个信息时，它会首先给遇到的第一个黑条分配一个值为1的比特，给与这个黑条相邻的白色间隙分配一个值为0的比特。随后的条纹和间隙被读做一行中的一系列比特，每个系列的比特可以是1位、2位、3位或4位，而这个位数取决于条纹和空隙的宽度。本例中扫描仪所扫描到的条形码与比特位之间的关系可以简单的表示为：

因此，整个UPC只不过是一串95位二进制数。在本例中，这些比特可以做如下分组。

前3位通常都是101，这就是最左边的护线，它帮助计算机扫描仪定位。从护线中，扫描仪可以确定代表单个比特的条和间隙的宽度是多少。否则，所有包装上的UPC就都得采用指定的大小了。

最左边的护线之后是6组比特串，每串含有7个比特位。其中每一组都可以是数字0\~9的编码，后面我会做一个简短的说明。接下来是一个5比特位的中间护线，这是一个固定的模式（始终是01010)，它是一个内置式的检错码。如果计算机扫描仪没有在应有的位置找到中间护线，它就无法破解UPC码。这条中间护线是用来预防条形码被篡改或被印错的一种方法。

9 二进制数

83

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=100&limit=10)
