補碼一位乘和補碼二位乘

2021-10-04 01:31:47 字數 1971 閱讀 8754

補碼一位乘

回顧原碼的一位乘:原碼一位乘是數值位之間的計算,計算之前需要對被乘數取絕對值,符號位單獨處理;而補碼乘法的符號位是計算過程中產生的,因此不需要對被乘數取絕對值。

被乘數和部分積均取2位符號位,因此乘數和被乘數均要在最高位擴位。補碼擴位原則:正數補0,負數補1.

乘數取一位附加位,作為乘數的最後一位,在移動時作為最低位處理,初始化值為0。

每次都對乘數末兩位(包括附加位)判斷,數值為00和11時進行右移1位操作,數值為01時部分積+[被乘數]補後進行移位,數值為10時部分積-[被乘數]補後進行移位。

移位次數與乘數數值位的位數有關,但最後一次移位完成後還需要進行步驟3,但不移位。

注意事項:

高位補位時,負數高位補1,正數高位補0。

符號位也參與運算

移位原則採取補碼算數移位(正數補零,負數右移補1,左移補0)

例題:[x]補=1.0101,[y]補=1.0011,求[x*y]補。

解:① 初始化部分積為00.0000,y補位後為10011, 附加位c=0,[-x]補=00.1011

② 判斷數10,進行部分積-[x]補,即00.0000+00.1011=00.1011,乘數移一位,高位補部分積的最低位,乘數原來的最低位往附加位移,第一次移位後:乘數 11001,c=1,部分積00.0101

③ 判斷數11,直接進行移位。第二次移位後:乘數11100,c=1,部分積00.0010

④ 判斷數01,進行部分積+[x]補。即00.0010+11.0101=11.0111,第三次移位後,乘數11110,c=0, 部分積11.1011。

⑤ 判斷數00,直接進行移位。第四次移位(乘數的尾數字數次)後,乘數11111,c=0,部分積11.1101。

⑥ 判斷數10,進行部分積-[x]補,即11.1101+00.1011=00.1000,此時不再進行移位了。

⑦ 形成結果,從部分積開始取小數點後8位,即00.10001111。

補碼二位乘

補碼二位乘與原碼二位乘相似,部分積和被乘數採用三位符號位,補碼的二位乘中乘數採用兩位符號位,在末尾再加一位附加位。

原理:部分積和被乘數採用3位符號位,高位擴位。乘數高位用兩位符號位+尾數,末尾加一位附加位,初始值為0

對乘數的末三位判斷,情況如下:

000:直接移兩位

001:部分積+被乘數的補碼後移動兩位

010:部分積+被乘數的補碼後移動兩位

011:部分積+2被乘數的補碼(也就是被乘數左移一位的結果)後移動兩位

100:部分積-2被乘數的補碼(也就是被乘數左移一位的結果)後移動兩位

101:部分積-被乘數的補碼後移動兩位

110:部分積-被乘數的補碼後移動兩位

111:直接移兩位

乘數的尾數分奇數偶數兩種情況:偶數時採取兩位符號位,奇數時採取一位符號位。偶數情況下:移位次數為尾數字數/2,最後一步仍然要對末三位判斷,但是不移位;奇數情況下移位次數為尾數字數/2+1次,最後一步也要對末三位判斷,然後移動一位(注意)。

直接上題

[x]補=0.0101,[y]補=1.0101,求[xy]補

解:① 規格化被乘數和部分積,取三位符號位,[x]補=000.0101,最好算一下2[x]補=000.1010,部分積000.0000;乘數尾數字位數為偶數,取兩位符號位,附加末尾位取0,得1101010

② 判斷值為010,進行部分積+[x]補,000.0000+000.0101=000.0101,第一次移位後:乘數0111010,部分積000.0001

③ 判斷值為010,進行部分積+[x]補,000.0001+000.0101=000.0110,第二次移位後,乘數1001110,

部分積000.0001

④ 最後一次判斷但是不移位,判斷值為110,此時進行部分積-[x]補,000.0001+111.1011=111.1100

開始取結果,從部分積開始取,連著最終乘數直到小數字達到被乘數的尾數字+乘數尾數字,即111.11001001,完。

定點原碼 補碼一位乘

移位操作對於任何計算機來說都是不可缺少的操作,各種計算機指令系統中都含有移位指令。這裡首先給大家介紹一下移位操作中的算術移位 原碼右移 補碼右移 算術原碼右移 符號位不變,各位右移,最高有效位補0,末位移出。列如 1.1001 右移 1.0100 0.1101 右移 0.0110 算術補碼右移 符號...

定點小數補碼一位乘(校正法)

程式 定點小數補碼一位乘 校正法 define crt secure no warnings include include include using namespace std const int n 4 數值位位數 a,b聯合右移 算術移位 void rightmove bitset a,bi...

高精乘 一位乘多位

比較簡單的高精乘,為多位乘多位做鋪墊 題目描述 傳說古代印度有個喜歡下棋的國王叫舍罕,而宰相達依爾是個聰明的大臣,發明了西洋棋。國王玩得愛不惜手,決定獎賞宰相。達依爾說 陛下,我別無他求,請你在這張棋盤的第乙個格仔裡賞我一粒麥子 在第 個格仔裡賞我2粒麥子 在第 個格仔裡賞我 粒麥子 在第 個格仔裡...