进制的基本原理

12/4/2022 book

一个数的大小,就是它各个位置的数字 乘以 对应进制的 该数字所在位置(从低位到高位的位置)减1 次方 的 和。

# 引出问题: 为什么是十进制

我们的日常生活中,大都采取10进制,比如10厘米等于1分米,10两等于1斤,这是为什么呢?

这是习惯决定的!

因为我们有10个手指,在没有纸笔和计算器的年代,我们是采用数手指的方式来计数的,这样很方便,久而久之,就形成了习惯,所以10进制不是一个科学性的定义,而是一个习惯性的定义。

现在让我们回到没有纸笔的时代。

假如现在你有1个苹果,因为没有纸笔,你可以伸出1根手指,来表示它;如果有9个苹果,你就伸出9根手指;如果是19个苹果呢,你只有10个手指头,该怎么表示?什么?把脚趾头用上?可以!1个脚趾头代表10,1手指头代表1(这里就可以把脚趾头代表的数位称为高位,手指头代表的数位称为低位),所以伸出1个脚趾头和9个手指头就可表示19:

$$19 = 1 \times 10 + 9 \times 1$$

也就表示19个苹果。

上述这一段废话暗含了两个点:

  • 1 只有10个手指头无法表示比10大的数,那么就需要用别的物体来代替,这里采用的是脚趾头。这就是算盘的设计原理。
  • 2 10以下的数字只需要一位数即可表示,而10以及10以上的数字需要两位数才能表示。这就是计算器的设计原理。

这两个点怎么理解呢?

# 追根溯源: 十进制的基本规则

上面我们说到了两个点,这里就来从本质理解下。

1个脚趾头等于10个手指头,换言之,就是1个10等于10个1,也就是: 1个十位上的1,等于10个个位上的1,更进一步的说法就是:一个高位上的1,等于10个低位上的1,所以,如果低位上的数字等于10,我们就向高位进1位来表示它。

ok,经过上述理解,我们可以得到结论:

对于10进制来说,最大的数字是9,也就是10-1,那么,大于9的就没法表示了,于是我们就进一位来表示它。

放大了来理解就是:高位上的1 等于 相邻低位上的 10倍,那么高位上的n(1<=n<=9)就等于相邻低位上的$$n\times10$$倍。对于常规的运算来说,都是低位在右边,高位在左边,就可以理解为:左边的数位的大小等于相邻右边的数位的10倍。

那么,数字abc就可以这样理解:c是个位,就表示cx1,b就是个位的10倍,就是bx10,a又是b位数的10倍,就是10x10,就表示ax10x10。

所以我们可以得到结论:对于10进制来说,任意一个数字,它的大小就是 各个位置的数字,乘以 10的 这个位置(从低位到高位的位置)减1 次方 的 和

比如abc:

$$abc = a\times100 + b\times10 + c\times1$$

$$abc = a \times10^2 + b\times10^1 + c\times10^0$$

从低位往高位看,c在第1位,b在第2位,a在第3位,所以他们的位置依次是1、2、3,位置减1就是0、1、2,10的"位置减1"次方就是: $10^0、10 ^1、10^2$,那么对应数字乘以10的 位置减1 次方的和就是: $$a \times10^2 + b\times10^1 + c\times10^0$$。

这正是我们得出的结论。

# 打开格局: 进制的最基础原理

我们前面得出了一个结论:

对于10进制来说,任意一个数字,它的大小就是 各个位置的数字,乘以 10的 这个位置(从低位到高位的位置)减1 次方 的 和

这是针对10进制来说的,那么,如果不是10进制呢,如果是2进制呢,那么就是:

对于2进制来说,任意一个数字,它的大小就是 各个位置的数字,乘以 2的 这个位置(从低位到高位的位置)减1 次方 的 和

把10替换为2即可,我们来验证下,还是用abc来说。

$$abc = a \times 2^2 + b \times 2^1 + c \times 2^0$$

又因为这是2进制,最大的数字就是2-1,也就是1,所以abc只能取0或1。

如果abc是110,那么就是: $$1\times4+1\times2+0\times1$$,也就是6。这跟10进制的计算没什么区别,这个结论可以用于任何进制。

所以我们将上述结论再放大一点就是:

对于N进制来说,任意一个数字,它的大小就是 各个位置的数字,乘以 N的 这个位置(从低位到高位的位置)减1 次方 的 和。

这就是本节开头给出的结论。

由此我们可以得出一个结论: N进制的特点

  • 1 表示方式上:最大数字是N-1,满N就进1。
  • 2 计算过程上:就是上述的结论。

好,现在你应该会表示并且计算二进制了,那么计算机为什么采用2进制呢?

# 触类旁通: 计算机为什么用二进制

因为简单!

计算机的底层是基于晶体管实现的,可以简单的理解为一组开关,打开就表示1,关闭就表示0,所以,采用二进制的话,计算机只需要简单的打开/关闭这些开关即可。

事物只有两种状态:有和无!用数字表示就是0和1!

"有和无"能表示数字吗?能!

比如,还是9个苹果,你可以这样表示:1001,这是2进制,利用上面的结论来计算=就是:$$1\times2^3+0\times2^2+0\times2^1+1\times2^0=9$$,我们只用了4个数字,假如手指头伸出表示1,蜷起表示0,那么一只手就足够表示了,这不比你伸出9个手指头方便吗?

用这种方法,10个手指头能表示的最大数字是多少呢?

我们知道,如果是10进制,那么最大的数字就是99_9999_9999,也就是$$10^{10}-1$$,只要把所有数位都弄成最大的数字就行了。同样的,二进制最大的数字是1,所以只要所有数字都是1,就表示最大的数字,也就是11_1111_1111,即:$$2^{10}-1$$,也就是1023。

所以10位数的二进制的取值范围就是:00_0000_0000到11_1111_1111,10个0到10个1之间,也就是0到1023。

计算机的底层是基于晶体管实现的,可以简单的理解为一组开关,打开就表示1,关闭就表示0,这样的话,32位的计算机,也就可以简单的理解为有32个开关,能表示的最大数字是多少呢?也就是$$2^{32}-1$$,这个数字太大了,不好表示,我们就定义:

$$2^{10}= 1024 = 1KB$$

$$2^{20} = 1024 \times 1KB = 1MB$$

$$2^{30}=1024 \times 1MB = 1GB$$

$$2^{40}=1024\times 1GB = 1TB$$

所以,$$2^{32}=2^{30} \times 2^2=4GB$$

对于计算机来说,要表示最大的数字,就把开关全部打开,表示最小的数字就把开关全部关闭,如此简单,所以,计算机采用二进制,是非常容易实现的。

我们知道,数学运算不仅包括数字计算,还包括逻辑计算,计算机采用二进制,0就表示false,1就表示true,这样更简便,更直观。这是10进制,准确点说,是所有N进制(N大于2)所不具备的。

对于10进制来说,在计算过程中,低位相加超过10,需要向前一位进位,那么有多少种组合呢?

5 + 5、4 + 6和6 + 4、3 + 7和7 + 3、2 + 8和8 + 2、1 + 9和9 + 1。

共9种组合,对于1进制呢,只有一种,就是1+1,这是可枚举的。

所以,站在计算机的角度来说,如果碰到1+1,不用计算,直接把相邻高位开关打开,低位开关关闭即可。其实计算机有更高效的做法,我们下一章会细讲。

# 归纳总结: 本节要点

本节的知识点很简单:

  • 1 N进制的数字范围为: [0, N-1],大于N就进一位。
  • 2 对于N进制来说,任意一个数字,它的大小就是 各个位置的数字,乘以 N的 这个位置(从低位到高位的位置)减1 次方 的 和

本节并没有多少知识讲解2进制,而是啰嗦一大堆废话,先站在人的角度提出问题,为什么要用10进制,然后站在人类的角度回答问题,然后找出10进制的基本表示方式和计算规则,最后将这个规则扩展开,应用到2进制,发现这些规则都是完全符合的,最后站在计算机的角度来回答为什么采用2进制,这是一个自顶向下再向上的逻辑,希望大家能理解。

所以我们不必纠结于几进制了,只要理解或者牢记上述两个结论,即使是10086进制,也是直接按在地上摩擦的。

本节的每个小标题都有个前缀,这个就是自顶向下再向上的思维,因为底层原理共通,所以我们先站在A的角度去研究A的底层,因为底层原理共通,所以利用A的底层就可以扩展到B的底层,最后,利用B的底层,就可以推出B的逻辑。这是快速扩张知识面的手段之一,也是解决非认知领域知识的方法之一,希望大家能够理解并运用。

下一节我们就讲解二进制中的位运算的法则和实现原理,我们下一节见。