在前面我们看到,用十进制来设计半加器是有不少困难的,因为它的状态太多了。如果想用简单的开和关去表达想要的计算,那么就要转向二进制。不过话说回来,你是否想过,为啥我们喜欢十进制呢?
为什么是十进制?
人类在大约20万年前走出非洲,分散到各地形成了各种文明,但为何在计数这一问题上,常常不约而同选用了十进制呢?
没错,答案就在我们的双手上,我们的十根指头与我们的十进制之间绝不是巧合。
设想一下原始人类的一次狩猎大丰收,一个首领兴奋地用指头在数着他们捕获的羊,一只,两只...哇,全部手指用光了还没数完,只好先在地上标识一下先,然后再把指头全部收回继续清点。
那么,这么一个标识的动作就是进位的雏形了,而我们最终形成对十进制的偏好也就不足为奇了。
其它的可能
据说非洲有部落是采用20进制,有学者去考察,发现他们数数时把脚指头也用上了,难怪呢!
而人其实有时会患上一种称为多指畸形的遗传性疾病,其中以六指症最为多见:
其实说是畸形是因为他们是少数派,如果他们成为主流,我们可能就会习惯使用十二进制了!
而怕老鼠的喵星人--哆啦A梦则可能喜欢二进制:
难道二进制真的是未来的趋势?据作者设定,它的生日是2112年9月3日。掐指头一算,哎呀,还不到100年了!话说小时候看书时觉得22世纪是件很遥远的事~
不过跟别人猜拳时就悲剧了:
而龙虾们如果有一天也能建立自己的文明,那么它们就可能是用四进制了:
截图来自《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(二进制).
反复加一,可以得到更多的值,红色的小1表示有进位:
以下为十进制与二进制及十六进制的一个对应表:
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为例:
那么我们有: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
对比一下二进制的“一一乘法表”与十进制的“九九乘法表”:
啊,如果从一开始就采用二进制该多好,这画面想想也要醉了,再笨的熊孩子估计也能分分钟就掌握它们!
二进制的代言人,“蔡10”小姐就在一首歌里感慨地唱道:“那画面太美我不敢看...”(《布拉格广场》,蔡依林 & 周杰伦)
我们现在觉得用二进制不方便,看着不习惯,那大概是因为没有从小就接受这样的方式。
如果你天天接触,估计你也会习惯了。
有这么一种说法:世界有10种人,一种是懂二进制的,一种是不懂的。
国家需要你这种懂二进制的!
关于进制的问题,就说到这里。有了以上基础,在下一篇将介绍如何构建最终的二进制半加器。