1. 从十进制到二进制

十进制

所谓十进制,包含两层含义:

  1. 个数字:0 1 2 3 4 5 6 7 8 9
  2. 如果数目超出了个,则向前进一:10 11 12 13 ... 100 101 ...

为什么是十个数,有一种观点认为是因为人有十根手指

而实际上,在各国的古代文明中,对于数字的数量和进位方式都或多或少有些区别

比如中国古代就有正字计数方法:

正字计数|200

这种计数方式,和阿拉伯数字很相似,它可以循环往复,用一个“正”字表示无穷无尽的数字,不好的地方在于它不能表示零,以及书写过于繁琐,不过在当时,已经是非常了不起的计数方式了。

再比如玛雅计数

玛雅计数|200

玛雅计数有20个数字,了不起的地方是它包含了零。但玛雅计数不是循环往复的,一旦超过了20个数,就开始变得“诡异”起来:

虽然不同文明的数字数量和进位方式不太一样,但是它们的数理逻辑是相同的:

数理逻辑是一样的|300

所以,使用何种进制,实际上并不影响数学逻辑

刘慈欣的《三体》中有一段描写人类和外星文明的沟通,就是以相同的数学逻辑为基础的

随着数学理论的发展,人类改进了阿拉伯计数法,最终成为我们现代计数的统一方法

选择阿拉伯计数的原因有很多,其中一个原因,就是阿拉伯计数具有以下优点

  1. 包含零:现代数学必须要有数字零
  2. 通过简单的方式进位:进位极其简单,不会因为进位而出现新的数字,比如汉字中的“廿”表示20,就是出现了新的文字。
  3. 书写极其简单:从0到9,大部分都可以一笔完成,极大的提高了演算效率

由于阿拉伯数字选择了十进制,所以我们才习惯于逢十进一。个人认为,这才是十进制变成通用进制的原因。

我们似乎认为进制永远不会改变,直到计算机的出现。

二进制

很难想象,二进制的发源地居然是中国

300多年前,德国哲学家莱布尼兹与一位钟表匠合作,想搞一架机器出来,希望机器能够进行简单的数学运算

莱布尼兹|300

在研究的过程中,莱布尼兹发现要让机器做计算,就必须要用数字表示机器的各种状态,但是要做出一个拥有很多状态的机器是很困难的。

于是,他从中国古代的《周易》中找到了灵感,《周易》里面出现了一种非常特别的计量方式,即用“是”和“否”来表示两种状态,然后其他的状态根据“是”和“否”演算得来。

这就是最古老的二进制。

莱布尼兹的机器做成了,但由于十分笨重且经常出问题,并没有得到社会的认可。

直到计算机的出现。

计算机是一个典型的只有两种状态(两种电流信号:高电平和低电平)的机器,用二进制再合适不过了,于是,莱布尼兹的理论重新被重视,并应用于计算机中。

计算机中,只有能表示两个数字:0和1,逢二进一。

于是有了:

0(0)  1(1)   10(2)  11(3)  100(4)  101(5)  ......

这样一来,就可以用1和0两个数表示所有数字了

既然能表示数字,就能完成数字的运算,我们只需要把十进制的数字转换成二进制的数字,然后告诉计算机二进制的数字,它就可以运算出结果了,然后再将算出来的结果转换成十进制即可。

计算机刚刚出现的时候,确实是这样做的,但现在都有了相应的内置程序,可以自动完成转换

十进制转二进制

比如,给定一个十进制数字293,可以使用以下方式转为二进制格式:

1. 将十进制数除以16,会得到一个商和余数

|300

2. 在余数后方的位置,依次写上4个数字:8,4,2,1

|300

3. 分析刚才求出的余数,看看在8421四个数字中,如何取才能保证取出的数字相加等于余数(每个数字最多可以取一次),在取出的数字下方记1,没有取出的数字下方记0

|300

4. 如果刚才求出的商不为0,则重复1-3步骤

|300

|300

5. 将刚才得到的二进制数字,从下往上拼接起来,就是该数的二进制格式

293的二进制格式是:0001 0010 0101

看上去比较复杂是吧,实际上,这种转换在开发中几乎不会用到,现代计算机都是自动完成的 对于16以下的数字(不包含16),可以直接通过8421码很快得到,比如15可以认为是8+4+2+1,对应的二进制是1111,7可以认为是4+2+1对应的二进制是0111

二进制转十进制

比如,给定一个二进制数字:101010101101101,将它转换为十进制数字,可以使用以下方式:

1. 将该二进制数从低位开始,每4个数字进行分割,最高位不足4位则补0

|300

2. 在每个4位的二进制数上方,标注上8421

|300

3. 对每个4位,对照8421和二进制数,二进制数是1的地方记录对应的8421上的数字,然后将它们加起来得到一个结果

|300

4. 将刚才得到的每一个结果,从低位到高位,依次乘以、、……最后把它们加起来就是最终结果

|300

绝大部分时候,二进制到十进制的转换同样不需要我们手动操作 对于4位的二进制,可以非常简单的使用8421码得到对应的十进制,例如1010相当于8+210