[計組]原碼、補碼及背後的數學原理
來自專欄機器學習小白筆記5 人贊了文章
有個梗叫做
PHP是最好的語言
我現在想說,二進位是世界上最完美的進位!
因為人類長著10個手指頭,所以自然的我們熟悉的生活就是10進位的。我們用了幾萬年的時間學會了表示數,學會了加減乘除,學會了各種運算規律。是前人不斷的發現和我們不斷的學習,讓我們掌握了10進位這種複雜的表達
但是學計算機的人都知道計算機其實是二進位的。事實上,生活中更普遍的都是二進位,電子元件的開與關,正與反,對與錯,二進位才是這個世界上應用最廣泛最簡潔完美的進位。至於為什麼最完美,以及更深刻的了解二進位,有興趣的童鞋可以看看這本查爾斯?佩措爾德《編碼》
接下來我想寫一下二進位的運算規律
以下所有的內容都以一個位元組(8-bit)為對象進行研究的,就是假設我們現在用的計算機都非常簡陋,儲存單元裡面就只能儲存一個位元組。並且都是定點數
- 無符號數和有符號數
無符號數可以表示從0到255總共256個數
因為計算機大部分都是有符號數,所以我們只看有符號數,有符號數可以表示-127到+127(注意:0有+0和-0)總共256個數。
2.小數和整數
順便說一嘴小數和整數,需要注意的是,整數我們可以表示從0到127中間的每一個整數,但是小數不行。從絕對值來看,小數最小是 ,就是0.0078125,接下來就是2個 ,也就是0.015625,所以說小數部分在十進位看來是有空隙的,想表示0.009,暫時用這種表示方法和這個簡陋的計算機是不可以的。
接下來就是重點部分
原碼:
其實就是上面的那種表示方法就是原碼了,最高位0/1是符號位,後面的是絕對值的數值
補碼:
補碼的出現大家都知道是為了計算減法而來的,那我們先從十進位的減法運算來一窺裡面的思想
十進位加法:
現在假設我們就是長著10個指頭的人,我們是小孩子要學算術,那麼3+4,就是數到第三個指頭,然後往右再數4個,就是7
更多位數的計算就是更多的小朋友
十進位減法:
7-4,小朋友先數到第7根指頭,然後減4就是往左邊數四個
假設你是一個只會往右邊數數的小朋友,往左邊數數對你來說很難,那麼你想要計算7-4的時候,可以7+6-10
同樣的,7-14的話,就7+6-20,往前走6個指頭,最後後退20步。
這樣做的好處就是,我們只用往前走就好了,往後退這個有難度的操作我們就10格10格的退
那麼這裡的6-10,其實就是-4的補碼
總結一下:
往前進,加法,不需要補碼
往後退,減法,需要補碼
補碼跟進位有關,10進位,就 的補
二進位補碼:
同樣的
往前進,加法,不需要補碼
往後退,減法,需要補碼
補碼跟進位有關,2進位,就 的補
因為我們研究的是8-bit的有符號數,所以我們就 的補
在計算整數的補碼的時候
比方說25-13,就是25+115-128
體現在運算上,就是取反+1,(因為13和114(13+114=127)是剛好相反的,然後再加上1)
小數同樣的道理,但是小數裡面,我們要用1來補
只要你理解了十進位在做減法的時候的補碼,二進位就能理解了
反碼:
反碼就是在求補碼的過程當中的中間的一步
總結感想:
奧卡姆剃刀原理告訴我們「如無必要,勿增實體」,這個世界的法則越簡單越好,補碼恰恰就是一個讓計算機簡單化的發明,計算機學會了加法,那麼就不要再教它減法了,只要告訴它減法就是另一種變形的加法就好了
推薦閱讀: