转自:《编码的奥秘》第二章

摩尔斯电码由萨缪尔·摩尔斯( 1 7 9 1 —1 8 7 2)发明,本书后面会在多处提到他。摩尔斯电码是随着电报机的发明而产生的,电报机我们以后也还要做详尽的说明。正如摩尔斯电码很好地说明了编码的本质一样,电报机也提供了理解计算机硬件的良好途径。

大多数人认为摩尔斯电码的发送易于接收,即使你没有记住摩尔斯电码,也可以方便地借助下面这张按字母顺序排列的表发送:

接收摩尔斯电码并将其翻译回单词比发送费时费力多了,因为译码者必须反向地将已编码的“滴-嗒”序列与字母对应。例如在确定接收到的字母是“ Y”之前,必须按字母逐个地对照编码表。

问题是我们仅有一张提供“字母→摩尔斯电码”的编码表,而没有一张可供逆向查找的“摩尔斯电码→字母”译码表。在学习摩尔斯电码的初级阶段,这张译码表肯定会提供很大的便利。然而,如何构造译码表却毫无头绪,因为我们似乎无法找出这些按字母顺序排列的“滴-嗒”序列的规律。

那么忘记那些字母序列吧,也许按照码字中“滴”“嗒”的个数来排列会是个更好的尝试。例如,仅含一个“滴”或“嗒”的摩尔斯电码序列只可能代表 E或T这两个字母之一:

两个“滴”或“嗒”的组合则代表了 4个字母I、 A、 N、 M:

三个“滴”或“嗒”的序列代表了 8个字母:

最后(如果不考虑数字和标点符号的摩尔斯电码),四个“滴”或“嗒”的序列则共代表了 1 6个字母:
 

四张表共包括2 + 4 + 8 + 16 = 3 0个编码,可与 3 0个字母相对应,比拉丁字母所需的 2 6个字母还多了 4个。出于这个原因,在最后一张表中,你可能注意到有 4个编码与重音字母相对应。

在翻译别人发送的摩尔斯电码时,上面 4张表提供了极大的便利。当你接收到一个代表特定字母的码字时,按其中含有的“滴”“嗒”个数,至少可以跳到其对应的那张表中去查找。每张表中,全“滴”的字母排在左上角,全“嗒”的字母排在右下角。

你注意到 4张表大小的规律了吗?每张表都恰好是其前一张表的两倍大小。这其中包含的意义是:前一张表的码字后加一个“滴”或加一个“嗒“,即构成了后一张表。

可以按下面的方式总结这个有趣的规律:

点划数         码字数
                                                                                    1                   2
                                                                                    2                   4
                                                                                    3                   8
                                                                                    4                  16

四张表中每张码字数都是前一张的两倍,那么如果第一张表含 2个码字,第二张表则含2× 2个码字,第三张表 2× 2× 2个码字。以下是另一种表达方式:

点划数         码字数
                                                                                    1                   2
                                                                                    2                   2× 2
                                                                                    3                   2×2×2
                                                                                    4                   2×2×2×2

当然,如果遇到数的自乘,可以用幂表示,例如 2× 2× 2× 2可以写成 2 4。数字 2、 4、 8、1 6分别是 2的 1 、 2、 3 、 4次幂,因为可以用依次乘 2的方法将它们计算出来。由此我们的总结还可以写成下面的方式:

点划数         码字数
                                                                                    1                   2¹
                                                                                    2                   2²
                                                                                    3                   2³
                                                                                    4                   2^4

这张表简单明了,码字数是 2的次方,次方数目与码字中含有的“滴”“嗒”数目相同。我们可以把表总结为一个简单的公式:

码字数 = 2 ^(“滴”与“嗒”的数目)

很多编码中都用到 2的幂,在下一章中我们会看到另一个例子。

为了使译码的过程更为简便,可以画出如下一张树形图:

这张表表示出了由“滴”与“嗒”的连续序列得出的字母。译码时,按箭头所指从左到右进行。例如,你想知道电码“滴-嗒-滴”代表的字母,那么从最左边开始选择点,沿箭头向右选择划,接着又是点,得出对应的字母是 R,它写在最后一个点的旁边。

如果认真考虑,会发现事先建立这样一张表是定义摩尔斯电码所必需的。首先,它保证了你不会犯给不同的字母相同码字的错误!其次,它保证你使用了全部的可用码字,而没有使“滴”与“嗒”的序列毫无必要的冗长。

我们可以加长码字至 5位或更长, 5位长的码字又提供了额外的 3 2( 2× 2× 2× 2× 2或2 5)个码字。一般而言,这就足够 1 0个数字和 1 6个标点符号使用。实际上,摩尔斯电码中的数字确实是 5位的,但在许多其他编码方式中, 5位码字常用于重音字母而不是标点符号。

为了包含所有的标点符号,系统必须扩充至 6位表示,提供 6 4个附加编码,此时系统可表示2 + 4 + 8 + 1 6 + 3 2 + 6 4共1 2 6个字符。这对摩尔斯电码而言太多了,以至于留下许多“未定义”的码字。此处“未定义”指不代表任何意义的码字,如果在你接收的摩尔斯电码中有未定义的码字,就可以肯定发送方出了差错。

由于推出了下面这条公式:
                                                                             码字数 = 2 ^(“滴”与“嗒”的数目)

我们就可以继续导出更长的码字位数所代表的码字数目。很幸运,我们不必为确定码字数目而写出所有可能的码字,我们所要做的不过是不断地乘 2而已:

点划数            码字数
                                                                                  1                    2^1= 2
                                                                                  2                    2^2= 4
                                                                                  3                    2^3= 8
                                                                                  4                    2^4 = 16
                                                                                  5                    2^5 = 32
                                                                                  6                    2^6 = 64
                                                                                  7                    2^7 = 128
                                                                                  8                    2^8 = 256
                                                                                  9                    2^9 = 512
                                                                                 10                   2^10 = 1024

摩尔斯电码被称为二元码 ( binary code ),因为编码中仅含“滴”和“嗒”。这与一个硬币很相似,硬币着地时只可能是正面或反面。二元事物(例如硬币)、二元编码(例如摩尔斯电码)常常用 2的乘方来描述。

上面所做的对二元编码的分析在数学上的一个分支—组合学 或组合分析 里只能算是一个简单的练习。传统上,由于组合分析能够用来确定事件出现的几率,例如硬币或骰子组合的数目,所以它常用于概率统计,但它也同样有助于我们理解编码的合成与分解。

编码的奥秘:编码与组合相关推荐

  1. 《编码的奥秘》---学习编程一年半的体会

    本人在校大学生,从大一下学期开始自学编程(JAVA).到现在2018年7月2号也过了一年半的时间了.期间做过很多应用程序(PS:大多数都是做着玩的),比如做一个GUI聊天室(JAVA).Android ...

  2. 编码的奥秘:图形化革命

    转自:<编码的奥秘>    第二十五章 1 9 4 5年9月 1 0日, <L i f e>杂志的读者看到的大多是平常的一些文章和照片:有关第二次世界大战结束的故事,舞蹈家 V ...

  3. 编码的奥秘: ASCII码和字符映射

    转自:<编码的奥秘>   第二十章 数字计算机存储器按位存储,所以,需要在计算机上处理的信息必须按位的形式存储.我们已经知道如何用位来表示数和机器码,下一个问题是如何用它来表示文本.毕境世 ...

  4. 编码的奥秘:逻辑门电路

    转自:<编码的奥秘>   第十一章 在遥远的将来,当人们回顾2 0世纪的计算机发展史时,有人可能会以为一种称为"logic gates(逻辑门)"的设备是以著名的微软公 ...

  5. 编码的奥秘:手电筒剖析

    转自:<编码的奥秘>  第四章 手电筒的用途极为广泛,用于在黑暗的遮盖物里阅读和用于发送编码消息只是两个用途最明显的方面.最普通的家用手电筒也能在教学演示中说明神秘物质电( e l e c ...

  6. 编码的奥秘:从算盘到芯片

    转自: <编码的奥秘>   第十八章 纵观历史,人类发明了很多灵巧的工具和机器以满足广泛的需求,从而使数学运算变得更容易了些.虽然人类天生就有使用数字的能力,但仍能经常需要帮助.人们常遇到 ...

  7. 编码的奥秘:发报机与断电器

    转自:<编码的奥秘>  第六章 1 7 9 1年,萨缪尔·摩尔斯生于马萨诸塞州的查尔斯顿镇,该镇是邦克山之战的地点,也是波士顿东北重镇.摩尔斯出生那年,美国宪法刚实施两年,乔治·华盛顿出任 ...

  8. 编码的奥秘:高级语言和低级语言

    转自:<编码的奥秘>    第二十四章 用机器码编程就像用牙签吃东西,刺的块很小且做起来很费力,吃一顿饭要花很长时间.同样,每个机器码字节只是完成可以想像得到的最小且最简单的计算工作-从内 ...

  9. 编码的奥秘:二进制数

    转自:<编码的奥秘>  第九章 1 9 7 3年,当安东尼·奥兰多在他写的一首歌中要求他挚爱的人"系一条黄色的绸带在橡树上"时,他并没有要求他的爱人进行繁琐的解释或冗长 ...

  10. 编码的奥秘:定点数和浮点数

    转自:<编码的奥秘>    第二十三章 日常生活中,有各种各样的数,整数.分数.百分数等等,我们无时无刻不与这些数打交道.如:用加班 2 . 7 5小时获得的 1 倍半的钱来买半匣鸡蛋需支 ...

最新文章

  1. 与时代共振,AI助力工业缺陷检测
  2. Blend for Visual Studio 2013
  3. Apache Sentry手动安装、使用手册
  4. 处理增删改_这10个批量处理的PPT技巧,让你的效率提升100倍!
  5. 银屑病相关饮食调研-毛蕊花的药用部位没查清-还需更新
  6. LoadRunner测试下载功能点脚本(方法一)
  7. 套套原来是这样装袋的,40个机械动图看懂好像并不容易。。。
  8. Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator
  9. php myflow,WordPress安装使用Flowplayer简易指南
  10. 关于IT结合测试,事前DB与事后DB的问题(之一:如何能更好的看出更新效果)。
  11. 软件测试第四组第一周作业第一天
  12. drawLine()方法画粗线
  13. 计算机隐藏图标和通知,win10系统通知区域图标、电脑右下角图标显示和隐藏设置的解决方案...
  14. 研报解读 | 中国云计算:从数据看未来
  15. Kafka高频面试题:夺命10连问
  16. 360浏览器强制使用急速模式
  17. nbu6.5 linux安装,Veritas.Netbackup 6.0 for Linux RedHat AS5.3安装问题
  18. PHP 代码覆盖率分析
  19. Keras模型中数据维度报错
  20. 评弹,有些味道,可惜听不懂!

热门文章

  1. android测试云模拟器,基于Android模拟器的调研
  2. 淘宝获得淘宝商品类目 API
  3. ASP.NET MVC:UrlHelper.cs
  4. ROS中的物体识别——ORK功能包的使用
  5. 两台redhat7虚拟机配置ssh免密访问
  6. jmeter录制 过滤_Jmeter录制pc脚本
  7. 适合有基础的Java实战项目——坦克大战 练手实战项目
  8. Windows 配置Java环境变量
  9. 阿拉伯文字库 阿拉伯语字库 阿拉伯 字库 变形组合算法
  10. G.726实时RTP音频流保存到AVI文件中