计组—定点数的运算
校驗(yàn)碼:
元件故障\噪聲干擾等各種因素常常導(dǎo)致計(jì)算機(jī)在處理信息過(guò)程中出現(xiàn)錯(cuò)誤,為了防止錯(cuò)誤,可將信號(hào)采用專(zhuān)門(mén)的邏輯線(xiàn)路進(jìn)行編碼以檢測(cè)錯(cuò)誤,通常的做法是在每個(gè)字上添加一些校驗(yàn)位過(guò)來(lái)確定字中出現(xiàn)錯(cuò)誤的位置。
(1).奇偶校驗(yàn)碼
組成奇偶校驗(yàn)碼的基本方法:在n位有效信息位上增加一個(gè)二進(jìn)制校驗(yàn)位,構(gòu)成一個(gè)n+1位奇偶校驗(yàn)碼。
奇校驗(yàn):使n+1位的奇偶校驗(yàn)碼中1的個(gè)數(shù)為奇數(shù)
偶校驗(yàn):使n+1位的奇偶校驗(yàn)碼中1的個(gè)數(shù)為偶數(shù)
?
缺點(diǎn):多位出錯(cuò)無(wú)法檢測(cè)
?
定點(diǎn)數(shù)的運(yùn)算
(只要涉及到加減運(yùn)算一定是補(bǔ)碼)
補(bǔ)碼加法運(yùn)算:
負(fù)數(shù)用補(bǔ)碼表示后,可以和正數(shù)一樣來(lái)處理,即當(dāng)需要減去一個(gè)數(shù)x時(shí),可以加上x(chóng)對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼[-x]補(bǔ)來(lái)代替
補(bǔ)碼的加法公式:
小數(shù):[x]補(bǔ) + [y]補(bǔ) = [x + y]補(bǔ) ? ? ?(注:需要將mod 2 丟掉) ?
整數(shù):[x]補(bǔ) + [y]補(bǔ) = [x + y]補(bǔ) ? ? ??(注:需要將mod 2^(n+1) 丟掉) ?
注:符號(hào)位和數(shù)值位統(tǒng)一進(jìn)行加法處理
?
補(bǔ)碼減法運(yùn)算公式
小數(shù):[x]補(bǔ) + [-y]補(bǔ) = [x - y]補(bǔ) ? ? ?(注:需要將mod 2 丟掉) ?
整數(shù):[x]補(bǔ) + [-y]補(bǔ) = [x - y]補(bǔ) ? ? ??(注:需要將mod 2^(n+1) 丟掉) ?
?
補(bǔ)碼運(yùn)算的基本規(guī)則:
1.運(yùn)算的各個(gè)操作數(shù)均是補(bǔ)碼表示,運(yùn)算結(jié)果仍是補(bǔ)碼
2.符號(hào)位與數(shù)值位一樣參加 運(yùn)算
3.若求和,則將兩補(bǔ)碼數(shù)直接相加,得到兩數(shù)之和的補(bǔ)碼;若求差,則將減數(shù)變成補(bǔ)碼(由[y]補(bǔ)求[-y]補(bǔ)),然后與被減數(shù)相加,得到兩數(shù)之差的補(bǔ)碼
4.補(bǔ)碼是對(duì)于確定的模而言,若運(yùn)算結(jié)果超過(guò)模(有從符號(hào)位上產(chǎn)生的進(jìn)位),則將模自動(dòng)丟掉
?
溢出概念與檢測(cè)
說(shuō)明:兩個(gè)正數(shù)相加的結(jié)果為負(fù)數(shù),兩個(gè)負(fù)數(shù)相加結(jié)果為正數(shù)這顯然都是錯(cuò)的
第一種檢測(cè)方法:兩個(gè)同號(hào)的數(shù)相加結(jié)果發(fā)生了改變(即變號(hào)了)則發(fā)生了溢出
(兩個(gè)異號(hào)數(shù)的相加不會(huì)發(fā)生溢出)
第二種檢測(cè)方法:雙符號(hào)位法,符號(hào)位有兩位用“00”表示正,“11”表示負(fù)。如果兩個(gè)數(shù)相加后,其結(jié)果出現(xiàn)“00”或者”11“則表示沒(méi)有溢出,出現(xiàn)”01“或”10“兩種組合時(shí),表示溢出
第三種檢測(cè)方法:單符號(hào)位法,當(dāng)最高數(shù)值位產(chǎn)生進(jìn)位而符號(hào)位無(wú)進(jìn)位時(shí),產(chǎn)生上溢,當(dāng)最高數(shù)值位無(wú)進(jìn)位而符號(hào)位有進(jìn)位時(shí),產(chǎn)生下溢,
即:當(dāng)最高數(shù)值位和符號(hào)位都進(jìn)位時(shí)或者都沒(méi)進(jìn)位則沒(méi)溢出,如果只有一者有進(jìn)位則溢出
?
任何數(shù)和0異或不變,和1異或取反;
?
定點(diǎn)數(shù)乘法運(yùn)算
對(duì)于乘法運(yùn)算,我們可以采用手工計(jì)算的方式,但對(duì)于計(jì)算機(jī)而言只有加減法,以下我們分析了對(duì)于兩個(gè)定點(diǎn)數(shù)的乘法運(yùn)算計(jì)算機(jī)是怎樣執(zhí)行的?
原碼一位乘法:計(jì)算機(jī)乘法運(yùn)算執(zhí)行過(guò)程
?
總體步驟就是:
(1).乘積的符號(hào)位進(jìn)行異或(相同得0即為正,不同得1即為負(fù)),確定數(shù)值的符號(hào)位
(2).數(shù)值部分按絕對(duì)值相乘
?
A=-0.1101 ?B=0.1011 計(jì)算 A*B,執(zhí)行過(guò)程如下
做加減法是針對(duì)補(bǔ)碼的原則進(jìn)行:所以求出|A|補(bǔ)=0.1101,|B|補(bǔ)=0.1011;即絕對(duì)值的補(bǔ)碼是其本身
說(shuō)明:因?yàn)槭撬奈欢M(jìn)制進(jìn)行乘法運(yùn)算,所以總共需要加四次(遇見(jiàn)1則加上被乘數(shù),遇見(jiàn)0則加上0,然后整體右移),并且右移四次;
初始化為0.0000,然后從乘數(shù)的地位開(kāi)始計(jì)算,
1.取出乘數(shù)最低位為1,所以加上被乘數(shù),即初始數(shù)據(jù)0.0000和被乘數(shù)0.1101相加結(jié)果為0.1101,然后連接乘數(shù)1011(即0.1101 1011)一起右移一位得0.0110 1101
2.取出第二位為1,所以加上被乘數(shù),即0.0110+0.1101值為1.0011,然后連接乘數(shù)1.0011?1101整體右移一位得0.1001 1110
3.取出第三位為0,加上0,結(jié)果不變0.1001 1110整體右移得0.0100 1111
4.取出第四位為1,加上被乘數(shù),即0.0100 +?0.1101值為1.0001 然后連接乘數(shù)1.0001?1111整體右移一位得0.1000 1111
5.乘積的符號(hào)位A異或B=1異或0=1
得結(jié)果的絕對(duì)值為0.1000 1111,然后帶上符號(hào)位[A * B]原=1.1000 1111
?
小結(jié):乘法運(yùn)算可用加和移位實(shí)現(xiàn),n=4,即加4次,移4次
由乘數(shù)的末位決定被乘數(shù)是否和原部分積相加(末位為1則加上被乘數(shù),為0則加上0),然后向右移一位形成新的部分積,同時(shí)乘數(shù)右移一位(末位移丟),空出高位存放部分積的地位(我們上面所說(shuō)的連起來(lái)整體右移 目的是便于理解)
?
定點(diǎn)除法運(yùn)算
首先討論手工進(jìn)行二進(jìn)制的除法運(yùn)算
(2^-1表示右移一位(除以2),2^-1 y 表示y右移一位)
總體步驟就是:
?
(1).符號(hào)位進(jìn)行異或(相同得0即為正,不同得1即為負(fù)),確定數(shù)值的符號(hào)位
(2).數(shù)值部分按絕對(duì)值相除
?
1.恢復(fù)余數(shù)法
所謂恢復(fù)余數(shù)法就是先作減法,若余數(shù)為正,才知道夠減;若余數(shù)為負(fù),才知道不夠減。不夠減時(shí)必須恢復(fù)原來(lái)的余數(shù),以便再繼續(xù)往下運(yùn)算。這種方法稱(chēng)為恢復(fù)余數(shù)法。要恢復(fù)原來(lái)的余數(shù),只要當(dāng)前的余數(shù)加上除數(shù)即可。
?
例:
x=-0.1011 ? y=-0.1101,則|x|補(bǔ)=0.1011 ?|y|補(bǔ)=0.1101 ?[-|y|]補(bǔ)=1.0011
(正數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼等于其正數(shù)補(bǔ)碼各位取反末位加1)
注意明確一點(diǎn):作差相當(dāng)于加負(fù)數(shù)的絕對(duì)值的補(bǔ)碼,即將減法轉(zhuǎn)換為加法,所以需要求出[-|y|]補(bǔ)
?
步驟說(shuō)明:
(1).首先做減法,即[|x|]補(bǔ) - [|y|]補(bǔ) =?[|x|]補(bǔ) + [-|y|]補(bǔ)?如果結(jié)果>0,則商1,然后除數(shù)右移一位2^-1 y,
(2).如果結(jié)果<0,則商0,然后恢復(fù)余數(shù)即結(jié)果值(余數(shù))加上除數(shù)[|y|]補(bǔ),即還原上一個(gè)余數(shù)的值,然后除數(shù)右移一位2^-1 y
然后依次重復(fù)1、2步
?
2.加減交替法
對(duì)于恢復(fù)余數(shù)法,使除法進(jìn)行過(guò)程的步數(shù)不固定,因此控制比較復(fù)雜
實(shí)際中常用不恢復(fù)余數(shù)法,又稱(chēng)加減交替法。其特點(diǎn)是運(yùn)算過(guò)程中如出現(xiàn)不夠減,則不必恢復(fù)余數(shù),根據(jù)余數(shù)符號(hào),可以繼續(xù)往下運(yùn)算,一次步數(shù)固定,控制簡(jiǎn)單。
分析:不夠減時(shí)的情況
第一步:當(dāng)某次減除數(shù)操作使得余數(shù)為負(fù)值時(shí)應(yīng)該商“0”,并加除數(shù)恢復(fù)余數(shù)
第二步:下一步的操作是右移一位除數(shù),再減去這個(gè)右移一位得除數(shù)。
若用R表示某次的負(fù)余數(shù),用B表示除數(shù),那么上述兩步操作可表示為:
R+B - B*2^-1=R+ B*2^-1 ?(B*2^-1表示B/2即右移一位)
即(原碼加減交替法運(yùn)算的法則)
方法1:針對(duì)除數(shù)的右移
(1)若夠減(余數(shù)>=0),商“1”,除數(shù)右移一位,減去這個(gè)右移的除數(shù),
(2)若不夠減(余數(shù)<0),商“0”,除數(shù)右移一位,加上這個(gè)右移的除數(shù)
?
方法2:針對(duì)余數(shù)的左移:
(1)若夠減(余數(shù)>=0),商“1”,余數(shù)左移一位,減去這個(gè)除數(shù),
(2)若不夠減(余數(shù)<0),商“0”,余數(shù)左移一位,加上這個(gè)除數(shù)
?
即在進(jìn)行原碼除法運(yùn)算時(shí),我們可以通過(guò)兩種方式實(shí)現(xiàn),即除數(shù)的右移或者是余數(shù)的左移(注意:要么就全部是余數(shù)的左移方式,要么就全部是除數(shù)的右移方式,切忌不可混合亂用,兩種方式擇一即可)
總結(jié)
除法就不斷的做”減法“,當(dāng)遇到余數(shù)>=0時(shí),商1,右移一位得除數(shù),余數(shù)繼續(xù)減去移位后的除數(shù);如果余數(shù)<0,則商0,然后除數(shù)右移一位,此時(shí)余數(shù)要加上右移后的除數(shù),然后再做減法(減去除數(shù)),如此往復(fù)。
即:一直做減法,遇到余數(shù)<0,則先做加法再做減法
總結(jié)
- 上一篇: xiao77论坛php,论坛(监控拍下1
- 下一篇: 计组—浮点数表示和运算