編碼,這個看上去就有點計算機風格的詞兒,其實早已融入了我們的生活。
NO.1
手指與數
我先問你一個問題,10個手指能表示幾個數?
如果你脫口而出——10個,這也不能怪你。一個手指一個數,十個手指十個數,這是大多數人的固化思維。
但你仔細想想就知道,我們一個手就能表示十個數啊:
(圖片來源:網路)
那麼,兩隻手就能表示10x10=100個數啊。
原來拳頭表示10,我們把它換成0。這樣的話,一個手當個位,一個手當十位,就能表示0-99共100個數字了。
僅此而已嗎?還能不能表示更多的數?
十進位制的話,已經是極限了。但如果換成二進位制,就能突破這個極限,表示更多的數。
二進位制,就是逢二進一。比如,二進位制10表示數字2,二進位制100表示數字4。
這樣的話,每個手指都有伸展和彎曲兩種狀態,分別代表二進位制世界裡的1和0。
一共有10個手指,每個手指有2種狀態,那麼就能表示2的10次方——也就是1024種不同的數字。
這就是編碼的威力,日常生活中我們經常用十進位制,計算機裡都是使用的二進位制。如果我們平常也能把二進位制思想運用起來,很多複雜的問題反而會迎刃而解。
下面我再舉兩個例子,讓你明白二進位制思想是如何應用的:
NO.2
分割金條
小明想裝修房子,他找了一個工人,工人告訴他說,需要7天的工作量。他們商量好一根金條作為報酬,但是工人要求每天都支付1/7的工資。
請問,你該如何在金條上只切兩刀,完成工人的要求呢?
很多人都被這個題難住了,一根金條切兩刀,最多也就能分成四塊啊,怎麼才能分成七份呢?
其實,他們都被固定思維限制住了。這個題看似是一個智力題,其實背後隱含著二進位制的思想。
我們再來仔細讀題,目標是切兩刀,使得每天能夠支付1/7的工資,並不是讓你把金條分成七份。(仔細閱讀這句話)
理解了這一點,解題思路也就來了:
先把金條7等分(不用切開,只是找到等分點),在1/7處切一刀,3/7處切另一刀。
這樣,兩刀將金條分成了三塊,它們的重量分別是1/7、2/7和4/7。
接下來,你的目的是,如何用這三塊金條,讓工人每天都能得到1/7。
換句話說,你希望只用1、2和4這三個數字就能表示1-7這七個數(仔細思考這句話)。
可以嗎?當然可以。
除了它們三個數本身之外,3=2+1,5=4+1,6=4+2,7=4+2+1.
你看,所有的數都表示出來了。
下面,就是你發工資的詳細過程:
第1天,給工人1/7的金條;
第2天,給工人2/7的金條,同時把1/7這根拿回來;
第3天,把昨天的1/7再給工人,此時工人手裡有3/7的金條;
第4天,給工人4/7的金條,把2/7和1/7都收回來;
第5天至第7天,重複第1天到第3天的方法即可。
這樣,只用3根金條,就可以完成7天的工資發放,而且工人每天都能得到1/7。
你可能會問了,為什麼是這個比例,1、2、4這三個數又有什麼玄機?
實際上,如果用二進位制表示的話,你就會發現端倪:
1的二進位制還是1;2的二進位制是10;4的二進位制是100.
你發現了嗎?這三個數分別是二進位制不同位數開頭的那個數。
這樣的話,它們三個互相組合,就可以將1-111(二進位制)這7個數表示出來。
你看,又是二進位制的思想發揮了作用。
如果你覺得還不過癮,下面這個例子會讓你深刻體會二進位制的威力。
NO.3
毒藥試驗
桌上有64瓶藥,只有1瓶是有毒的。已知小白鼠喝毒藥後,第二天就會死亡。並且無毒的藥可以一起喝,不會有任何副作用。你只有一天的時間,請問至少需要多少隻小白鼠,才能找到這瓶毒藥?
如果你還是脫口而出64只,那我只能請你放過小白鼠。
蠻幹是不行的,我們還是用二進位制的思想來解決這個問題。
具體來說,先把這64個瓶子按0-63進行編號,當然是二進位制的(或許你已經猜到)。
在二進位制中,63用111111來表示,所以你可能發覺了,用6只小白鼠就足夠了。具體編碼方式如下:
瓶子編號 |
第1只 |
第2只 |
第3只 |
第4只 |
第5只 |
第6只 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
2 |
0 |
0 |
0 |
0 |
1 |
0 |
... |
... |
... |
... |
... |
... |
... |
62 |
1 |
1 |
1 |
1 |
1 |
0 |
63 |
1 |
1 |
1 |
1 |
1 |
1 |
也就是說,每一個瓶子的編號,唯一對應了6位的二進位制碼,而每一列,也就是二進位制編碼的每一位,從左到右依次對應了一隻小白鼠,總共6只小白鼠。
接下來,試驗開始,從0號瓶開始,讓小白鼠開始喝藥。要求是:只有二進位制碼為1對應的那隻小白鼠才喝(當然你讓0對應的小白鼠喝也行)。
舉個例子,2號瓶對應的二進位制碼中,從左到右的第5位是1,因此只有第5只小白鼠喝,其它的不喝。
這樣,第二天,如果有小白鼠死了,你就可以根據死的是哪隻來推斷哪個瓶子裡是毒藥。
比如,第2、4、6只小白鼠死了,這說明編號010101的瓶子裡是毒藥。
因為只有這個序列才能讓第2、4、6只小白鼠喝藥,其它的不喝。別忘了,我們的二進位制編號是唯一的。
而二進位制數010101對應的十進位制數是21,因此,編號為21的瓶子裡是毒藥。
回過頭來看,為什麼非得是6只呢?
站在小白鼠的角度,它的選擇只有兩種,要麼喝,要麼不喝,分別對應了二進位制世界裡的1和0。
1個小白鼠有2種狀態,那麼6只小白鼠就有2的6次方——64種狀態,而這正好對應了64個瓶子,也就是64個二進位制數。
因此,對瓶子的編號進行二進位制編碼,就是最優的選擇。
最後
希望這三個例子能讓你對編碼有更深的理解,明白不僅僅是計算機世界需要編碼,我們日常生活中也會用到二進位制的思想。