二进制编码的本质和妙用

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

人和计算机对信息编码的差异

编码其实就是对一个对象加一个代号,在计算器发明之前就有,比如文字就是对信息的一种编码,数字也是。我们的名字,街道的名字,数学方程式等都是编码。

不过不同于其他的编码,计算机编码完全是为了区分不同的对象,因此人们在一开始就需要根据区分对象的数目设计好编码,再把真实世界的对象对应到某个编码中,因此计算机编码从一开始就是抽象的。

二进制编码的妙用

二进制编码的本质就是区分不同的对象或者状态,善用二进制编码,可以帮助我们用最小的代价去表示所有的情况并进行比对。

接下来我就用两个例子来说明这个问题。

分割黄金问题

泰勒是一名雇主,雇佣鲍勃为自己工作,工期一共七天。泰勒答应一共支付一根金条作为报酬,但是鲍勃要求每天给1/7的工资。请问如何在今天上切两刀,保证每天正好支付1/7的工资。

这个问题,我们很容易陷入如何两刀把一根金条平分成七份的纠结之中,这样其实很难操作。

但是如果我们换个思路,其实这个问题是在问,如果表示出1/7,2/7,…7/7这其中状况,如果我们用二进制来表示7种状况的话,我们可以立马想到,只需要三位就可以,即001~111这七种,而我们只需要分别有三个部分,分别表示每一位的1就好,即用十进制表示的1,2,4。所以说,我们只需要两刀将金条切成1/7,2/7,4/7就好

这样第一天给1/7那块,第二天给2/7那块,再要回1/7那块,如此往后推演即可。

小白鼠实验问题

假设有64瓶药,其中63瓶是无毒的,假设小白鼠喝有毒的会死掉,且一只小白鼠只能参与一次实验,请问最少需要几只小白鼠。

这个问题也可以用二进制编码的方式来解决。

64需要6位来表示,所以我们只需要六只小白鼠,然后000000~111111所有的毒药组合中,对于每一瓶药,用二进制表示其编号之后,如果第n位为1,则该瓶要就给n号小白鼠。

举个例子,假设110001号药水,就要喂给1,2,6号小白鼠。

在这种情况下,如果没有小白鼠死亡,就是0号有毒。

这种方式其实是用每个小鼠是否死亡作为每一位的编码是0还是1来表示出了64种情况。