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