码农翻身摘录
三次握手:驗證雙方發(fā)信和收信能力問題
?第一次握手:京城發(fā)信,縣衙收到了,此時縣衙就會明白,京城的發(fā)信能力和自己的收信能力沒有問題。
?第二次握手:縣衙發(fā)信,京城收到了,此時京城就會明白,京城的發(fā)信和收信能力都是沒有問題的,縣衙的發(fā)信和收信能力也都是沒有問題的。但是縣衙還不知道自己的發(fā)信能力如何,所以需要第三次握手。
?第三次握手:京城發(fā)信,縣衙收到了,其實第二握手的時候京城已經(jīng)知道雙方的收信、發(fā)信能力都是沒有問題的,這次回應(yīng)的目的只是消除縣衙對自己的發(fā)信能力和京城的收信能力的擔(dān)憂而已。
為什么需要補碼
?熱愛編程的張大胖在大學(xué)時最煩的一門課之一就是《數(shù)字電路》 , 他一直覺得和編程沒什么關(guān)系。有一次課程設(shè)計是實現(xiàn)一個加法器, 大胖使用邏輯電路, 費了九牛二虎之力才實現(xiàn)了4位的加法。
這4個二進(jìn)制位能表達(dá)的數(shù)有16個, 從0 到15 :
還不錯, 再計算一下 9+7 :
9+8 = 1001 + 1000= 0001怎么變成了1 ? 奧, 我這兒只有4位,能支持的最大數(shù)字就是 15 , 而9+8的結(jié)果是 10001 (十進(jìn)制16),計算結(jié)果溢出, 最高位的1被丟棄了!
其實這也符合要求, 大胖順利的交了作業(yè)。
用加法來表示減法
可是下一次課還是課程設(shè)計,老師竟然要求在這個加法器上實現(xiàn)減法 ,這可把大胖給難住了, 在加法器上實現(xiàn)減法,真是個變態(tài)的需求。
遇到了問題,張大胖自然會“跪求”好基友, 電腦高手Bill。
Bill 說:“這個要求一點都不變態(tài),用加法器同時實現(xiàn)加法和減法,能極大的節(jié)省CPU的電路設(shè)計。 ”
“你就說該怎么實現(xiàn)吧”
Bill說:“我先給你說一下原理,在你定義的4位二進(jìn)制中,一共可以表達(dá)16個數(shù)我們引入一個‘補數(shù) '的概念,例如 3的補數(shù) 是 13,4的補數(shù)是12,5 的補數(shù)是11,當(dāng)你計算7減去3 的時候,可以變成 7加上3 的補數(shù),即 7 + 13 ”
“可是7+13 是20,但是7-3 等于4 啊”
“20其實已經(jīng)超出你4位二進(jìn)制能表達(dá)的16個數(shù)了,已經(jīng)溢出了,對吧,所以20還得減去16 ,就是4 了。你用二進(jìn)制算一下?!?/p>
7-3 = 0111- 0011 = 0111 + 1101(二進(jìn)制13) = 10100
10101已經(jīng)溢出了, 去掉最高位是 0100 ,就是十進(jìn)制4 了。
“果然不錯” 張大胖說 “這讓我想到了鐘表,現(xiàn)在是7點, 我想讓它回到4點, 有兩種辦法, 一種方法是讓時針后退 3 格,另外一種方法是讓時針前進(jìn)9格, 前進(jìn)到12點的時候, 其實就相當(dāng)于溢出了,舍棄掉。 "
Bill 說, “看來你已經(jīng)Get了,數(shù)學(xué)上有個詞叫做求模, 說的就是這個運算,還以時鐘為例” 。
“這是一種以進(jìn)為退的策略” Bill 接著說 " 用這種辦法就把減法變成了加法"
“但是我怎么得到所謂的補數(shù)呢?從3 怎么得到13 呢”
“這很簡單, 對于二進(jìn)制, 前輩們想出了一個異常簡單,又特別適合計算機的算法, 對二進(jìn)制數(shù)的所有位取反,然后加1 ”。
“這就是所謂的 補碼了” Bill總結(jié)道。
Bill 問道:“剛才咱們說的都是整數(shù)的加減法, 負(fù)數(shù)你考慮了沒有啊? 大胖?”
“我也剛剛想到,現(xiàn)在我知道 7-3 可以換算成 7+ 13 了,如果是3 - 7 呢?”
“負(fù)數(shù)一引入,系統(tǒng)就變得更復(fù)雜了,首先你得用一個標(biāo)志位來表示整數(shù)還是負(fù)數(shù)吧: ”
“先別急,之前說到減法可以變成加法,秘密就是用補碼,例如8-3 相當(dāng)于8+(-3)的補碼 , 那我們完全可以把表格1中的負(fù)數(shù)用補碼表示,然后把那個負(fù)0 特別當(dāng)做 -8來處理”。
Bill 接著說: “按照上面的表格,現(xiàn)在我們來計算一下 7-4 , 7是 0111,-4是 1100,注意我們把符號位也算進(jìn)去了,兩者相加: “讓我試試4-7, ” 張大胖說,4是0100 ,-7是1001,兩者相加:“妙啊” 張大胖不禁贊嘆起來, “把負(fù)數(shù)用補碼表示,不但減法變加法, 連符號位都可以參與運算了!”
“ 是啊, 我們通過補碼能極大的簡化電路的設(shè)計, 你一定要記住,
"此外, 我想你也能總結(jié)出來, 你這個4位的系統(tǒng)如果只表示無符號數(shù)(沒有負(fù)數(shù)的話) , 它的范圍是[0 , 2 ^ 4] ,即[0, 16] ;
如果要想表達(dá)有符號數(shù)(負(fù)數(shù)和整數(shù)), 它的范圍就是[-2^3, 2^3-1] , 即[-8, 7] 。 在高級編程語言像C, Java ,你經(jīng)常會看數(shù)據(jù)類型的取值范圍, 你應(yīng)該明白其中的原理了。
總結(jié)
- 上一篇: mysql下载简书_安装MySQL
- 下一篇: 粉末XRD解单晶详细的测试条件及分析方法