# 抽象与表示

用一句话来讲计算机的功能,就是传输、储存和处理信息。要完成这样的任务,就要对信息本身进行编码,对信息要传送的目的地编码,对存储信息的物理单元进行编码。因此,有效的编码既是计算机科学的基础,也是掌握这门学科的钥匙。

文字其实就是对信息的编码,数字也是,我们的名字、街道的名称、化学符号、数学方程都是编码。我们在给人和街道起名字的时候,常常都是觉得好听,有意义就好,但是计算机对不同对象编码时强调的是效率。

生活中我们常使用的编码其实是从具体到抽象慢慢演变出来的,比如地址就是对一个地点进行的编码,但是很多地址名称是重复的,比如每个城市可能都会有一条黄河路或者解放路。计算机为了区分不同的对象,从一开始就是抽象的,比如互联网上不同的IP地址,计算机不同端口的地址,内部寄存器不同单元的地址等等。计算机编码也有弊端,就是这些内部的编码计算机可以理解,但是人看了后可能很难明白其中的含义。

计算机内部使用二进制是因为科学家认为,这个世界上所有信息都可以通过二分法来确定,而且效率很高。比如,我们可以用0代表正、1代表负,用0表示小,1表示大,用多个二进制的组合,就能对各种信息和对象进行编码。二进制所代表的编码,很容易通过开关电路来产生、输出和辨识,为了方便我们更好的使用二进制编码来控制计算机,更接近人类能记住的符号和高级语言应运而生(C、C++、Java),高级语言的本质是连接人类想法和计算机编码之间的桥梁。

作为一个好的计算机从业者,最终要习惯于二进制对各种信息进行编码,下面是一个很好玩的编码测试题:

一位雇主,雇佣一名工人为他的新房布设地砖,这项工作的工作量为7个工作日。他答应给工人一根金条作为报酬,但是工人要求每天支付1/7的工资,请问如何在金条上切两刀,保证每天正好能付他1/7的工资呢?

大部分的人都想试图控制刀子切金条的方向,将它切成等质量的7份,但事实上这样做不到,因为一个长方体,不论怎样平着切两刀,都只能分出四份,如果切割的是曲面,就很难控制精度。换个角度想一想,这道题就会很简单,我们在金条的1/7的地方切一刀,再3/7的地方再切一刀,这样就变成了三个小金块,质量分别是:1/7、2/7、4/7。

发工资时,第一天给工人1/7,第二天给他2/7那块并要求交回1/7,第三天给他1/7,第四天给他4/7并要求交回1/7、2/7,第五天给他1/7,第六天给他2/7,并让他交回1/7,第七天给他1/7。

这道题的解法中关键是1、2、4可以表达1~7中的所有数字,为什么是1、2、4而不是1、3、3呢,因为它们分别是二进制中的个位数、十位数和百位数,二进制只有0和1两个数字,每个进位是0或者1的组合,就能表示各种数字。

# 数据表示的精度和范围

在信息论中,若给定编码的长度,其能所表示不同信息的数量是有限的。给定16位二进制数字,不论怎么编码,最多能表示65536个不同数字。这个范围的精度为个位数,也就是彼此之间最小的差距是1,如果想提高精度,例如在整数后面加上0.99或者0.88,那么这些数字能表示的范围就会缩小到600多了。