计算机是如何做加法的?(5)——从十进制到二进制

摘要:介绍了关于进制的一些基础知识。

目录
[隐藏]

在前面我们看到,用十进制来设计半加器是有不少困难的,因为它的状态太多了。如果想用简单的开和关去表达想要的计算,那么就要转向二进制。不过话说回来,你是否想过,为啥我们喜欢十进制呢?

为什么是十进制?

人类在大约 7 万年前走出非洲,分散到各地形成了各种文明,但为何在计数这一问题上,常常不约而同选用了十进制呢?

没错,答案就在我们的双手上,我们的十根指头与我们的十进制之间绝不是巧合。

设想一下原始人类的一次狩猎大丰收,一个首领兴奋地用指头在数着他们捕获的羊,一只,两只……哇,全部手指用光了还没数完,只好先在地上标识一下先,然后再把指头全部收回继续清点。

那么,这么一个标识的动作就是进位的雏形了,而我们最终形成对十进制的偏好也就不足为奇了。

其它的可能

据说非洲有部落是采用 20 进制,有学者去考察,发现他们数数时把脚指头也用上了,难怪呢!

而人其实有时会患上一种称为多指畸形的遗传性疾病,其中以六指症最为多见:

image

其实说是畸形是因为他们是少数派,如果他们成为主流,我们可能就会习惯使用十二进制了!

而怕老鼠的喵星人–哆啦 A 梦则可能喜欢二进制:

image

难道二进制真的是未来的趋势?据作者设定,它的生日是 2112 年 9  月 3 日。掐指头一算,哎呀,还不到 100 年了!话说小时候看书时觉得 22 世纪是件很遥远的事~

不过跟别人猜拳时就悲剧了:

image

而龙虾们如果有一天也能建立自己的文明,那么它们就可能是用四进制了:

image

截图来自《Code》一书。

广义的进制

如果我们把标准放松一点,那么就不难发现人类社会中是存在很多的进制的。

比如以时间为例,它混合了各种的进制。小时是 12 或者 24 进制,而分秒则是 60 进制。只不过我们还是用十进制方式来书写它们。23:59:59,再加一秒是 00:00:00,因为满 60 或者满 24 就要进位了,进位后就归零了。

如果注意到 12 可以被 2,3,4,6 整除,而 60 则能被 2,3,4,5,6 整除。那么采用这样的进制是有助于去更细地划分它们的。

而货币方面,比如英国曾经是这样的:1 英镑等于 20 先令,而 1 先令又等于 12 便士。

1 先令等于 12 便士自然也能使得它易于分割。

而我们中国古代的秤,斤两之间曾经采用过 16 进制。

你以为“半斤八两”是怎么来的?

16 进制自然可以使得对一斤多次取半还能取整。

进制的总结

下面对各种进制做些小结。

1. N 进制有 N 个不同的数字(符号)。

所以,十进制就有十个不同数字,0,1,2,3,4,5,6,7,8,9;

那么,二进制就有两个不同数字,0,1;(借用了十进制的符号)

如果是十六进制呢?那么即便借了十进制的全部符号还是不够用,此时要么发明一些新的符号,要么就再借用一些别的符号了。

对于十六进制,实际借用了 6 个大写字母,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。

2. N 进制逢 N 进 1。

十进制逢十进一,二进制就是逢二进一。

对于二进制,1+1 就要进位了,因为结果是 2,但二进制根本不存在 2 这个符号,最大也就是 1。进位后加位归零,结果是 10(二进制).

decimal carry compare to binary

反复加一,可以得到更多的值,红色的小 1 表示有进位:

binary number correspond to decimal

以下为十进制与二进制及十六进制的一个对应表:

image

3. N 进制一个位最多只能表示 N 种不同状态,要想表示更多的状态,就要用更多的位。两个位能最多表示 N×N 种状态,三个位能表示 N×N×N 种状态,依次类推。

一位 16 进制能表示 16 种状态,两位则能表示 16×16=256 种状态。

一位十进制能表示 10 种状态,两位则能表示 10×10=100 种状态。

同理,一位二进制能表示2种状态,两位则能表示2×2=4种状态。

自然,要表示同样多种状态,二进制比十进制需要更多的位数。正如上面显示,至少 4 位才能表示。

但尽管如此,任何一个十进制整数都是可以用二进制来表示的。用康托尔的话来说就是两个无穷集合是一一对应的。

进制的转换

对于一个十进制的数,比如说 368,它的实质是什么呢?

其实是:3×102+6×101+8×100

=300+60+8

=368

对于 N 进制而言,N 就是这个指数的底;指数则是右边最低位为  0,然后向着左边的高位递增。

二进制转十进制

所以对于一个二进制数,比如 1010 来说,它对应的十进制数为:

1×23+0×22+1×21+0×20=8+0+2+0=10

所以10102=1010

下标为相应进制。

十进制转二进制

而对于十进制到二进制的转换,则通过反复对 2 整除直到商为 0,然后取对应余数来获取。比如以 12 为例:

decimal to binary

那么我们有:1210=11002

二进制的优势

以加法表为例,如果使用的是十进制,严格地讲,有 10×10=100 种情况需要考虑。

想想我们曾经背过的九九乘法表,它已经去掉了 0,以及结合了交换律去掉了一些重复的情况,却还依然有高达 45 个条目,作为加法表,也是如此。

如果采用二进制呢?这个数目就大大减少了。

对于 N 进制而言,有 N×N 种规则需要考虑。因此,对二进制而言,只有四条规则。

二进制的加法表只有以下四条规则:

0+0=00,

0+1=01,

1+0=01,

1+1=10。

乘法表甚至更简单,因为不涉及进位:

0×0=0,

0×1=0,

1×0=0,

1×1=1。

如果不考虑与 0 相乘的情况,则只有一个条目:1×1=1。

对比一下二进制的“一一乘法表”与十进制的“九九乘法表”:

image

啊,如果从一开始就采用二进制该多好,这画面想想也要醉了,再笨的熊孩子估计也能分分钟就掌握它们!

二进制的代言人,“蔡10”小姐就在一首歌里感慨地唱道:“那画面太美我不敢看…”(《布拉格广场》,蔡依林 & 周杰伦)

我们现在觉得用二进制不方便,看着不习惯,那大概是因为没有从小就接受这样的方式。

如果你天天接触,估计你也会习惯了。

有这么一种说法:世界有 10 种人,一种是懂二进制的,一种是不懂的。

image

国家需要你这种懂二进制的!

关于进制的问题,就说到这里。有了以上基础,在下一篇将介绍如何构建最终的二进制半加器。

发表评论

电子邮件地址不会被公开。 必填项已用*标注