Booth算法

Booth算法

數學專業術語
比較好的帶符号數乘法的方法是布斯(Booth)算法。它采用相加和相減的操作計算補碼數據的乘積。Booth算法對乘數從低位開始判斷,根據兩個數據位的情況決定進行加法、減法還是僅僅移位操作。判斷的兩個數據位為當前位及其右邊的位(初始時需要增加一個輔助位0),移位操作是向右移動。[1]
    中文名:Booth算法 外文名:Booth 所屬學科:數學 适用領域:信息科學 方法:操作計算補碼數據的乘積

基本内容

在上例中,第一次判斷被乘數0110中的最低位0以及右邊的位(輔助位0),得00;所以隻進行移位操作;第二次判斷0110中的低兩位,得10,所以作減法操作并移位,這個減法操作相當于減去2a的值;第三次判斷被乘數的中間兩位,得11,于是隻作移位操作;第四次判斷0110中的最高兩位,得01,于是作加法操作和移位,這個加法相當于加上8a的值,因為a的值已經左移了三次。

一般而言,設y=y0,yly2…yn為被乘數,x為乘數,yi是a中的第i位(當前位)。根據yj與yi+1的值,Booth算法表示如下表所示,其操作流程如下圖所示。在Booth算法中,操作的方式取決于表達式(yi+1-yi)的值,這個表達式的值所代表的操作為:

0無操作

+1加x

-1減x

Booth算法操作表示

yiyi+1操作說明

00無處于0串中,不需要操作

01加x1串的結尾

10減x1串的開始

11無處于1串中,不需要操作

乘法過程中,被乘數相對于乘積的左移操作可表示為乘以2,每次循環中的運算可表示為對于x(yi+1-yi)2^31-i項的加法運算(i=3l,30,…,1,0)。這樣,Booth算法所計算的結果可表示為:

x×(0-y31)×2^0

+x×(y31-y30)×2^1

+x×(y30-y29)×2^2

+x×(y1-y0)×2^31

=x×(-y0×231+y1×2^30+y2×2^29+y31×2^0)

=x×y

舉例

例:用Booth算法計算2×(-3)。

解:補=0010,[-3]補=1101,在乘法開始之前,R0和R1中的初始值為0000和1101,R2中的值為0010。

在乘法的第一個循環中,判斷R1的最低位和輔助位為10,所以進入步驟1c,将R0的值減去R2的值,結果1110送人R0,然後進入第二步,将R0和Rl右移一位,R0和R1的結果為11110110,輔助位為l。

在第二個循環中,首先判斷Rl的最低位和輔助位為0l,所以進入步驟1b,作加法,R0+R2=1111+0010,結果0001送入R0,這時R0R1的内容為00010110,在第二步右移後變為00001011,輔助位為0。

在第三次循環中,判斷位為10,進入步驟lc,R0減去R2,結果1110送入R0,R1不變;步驟2移位後R0和R1的内容為111101011,輔助位為1。

第四次循環時,因兩個判斷位為11,所以不作加減運算,向右移位後的結果為11111010,這就是運算結果(—6)。

這個乘法的過程描述如下表所示,表中乘積一欄表示的是R0、R1的内容以及一個輔助位P,黑體字表示對兩個判斷位的判斷。

用Booth補碼一位乘法計算2×(-3)的過程

循環

步驟

乘積(R0,R1,P)

0

初始值

000011010

第一次循環

1c:減0010

111011010

2:右移1位

111101101

第二次循環

1b:加0010

000101101

2:右移1位

000010110

第三次循環

1c:減0010

111010110

2:右移1位

111101011

第四次循環

1a:無操作

111101011

2:右移1位

111110101

4.補碼兩位乘

補碼兩位乘運算規則是根據補碼一位乘的規則,把比較yiyi+1的狀态應執行的操作和比較yi-1yi的狀态應執行的操作合并成一步,便可得出補碼兩位乘的運算方法。

補碼兩位乘法運算規則如下

判斷位yi-1yiyi+1

操作内容

000

[zi+1]補=2-2[zi]補

001

[zi+1]補=2-2{[zi]補+[x]補}

010

[zi+1]補=2-2{[zi]補+[x]補}

011

[zi+1]補=2-2{[zi]補+2[x]補}

100

[zi+1]補=2-2{[zi]補+2[-x]補}

101

[zi+1]補=2-2{[zi]補+[-x]補}

110

[zi+1]補=2-2{[zi]補+-x}補}

111

[zi+1]補=2-2[zi]補

由上表可見,操作中出現加2[x]補和加2[-x]補,故除右移兩位的操作外,還有被乘數左移一位的操作;而加2[x]補和加2[-x]補,都可能因溢出而侵占雙符号位,故部分積和被乘數采用三位符号位。

例:[x]補=0.0101,[y]補=1.0101求:[x·y]補。

解:求解過程如下表所示。其中乘數取兩位符号位即11.0101,[-x]補=1.1011取三符号位為111.1011。

部分積

乘數

說明

000.0000

+000.0101

1101010

判斷位為010,加[x]補

000.0101

000.0001

+000.0101

0111010

→2位

判斷位為010,加[x]補

000.0110

000.0001

+111.1011

01

1001110

→2位

判斷位為110,加[-x]補

111.1100

1001

最後一步不移位,得[x·y]補

故[x·y]補=1.11001001

可見,與補碼一位乘相比,補碼兩位乘的部分積多取一位符号位(共3位),乘數也多取一位符号位(共2位),這是由于乘數每次右移2位,且用3位判斷,故采用雙符号位更便于硬件實現。可見,當乘數數值位為偶數時,乘數取2位符号位,共需作n/2次移位,最多作n/2+1次加法,最後一步不移位;當n為奇數時,可補0變為偶數位,以簡化邏輯操作。也可對乘數取1位符号位,此時共作n/2+1次加法和n/2+1次移位(最後一步移一位)。

對于整數補碼乘法,其過程與小數乘法完全相同。為了區别于小數乘法,在書寫上可将符号位和數值位中間的“.”改為“,”即可。

再補充一道例子,增加一下理解。呵呵

例1.37設被乘數M=0111(7),乘數Q=0011(3),相乘過程如下:(其中的①②……是我自己加上去的)

AQQ-1

①000000110初始值

②100100110A=A-M

③110010011右移(第1次循環)

④111001001右移(第2次循環)

⑤010101001A=A+M

⑥001010100右移(第3次循環)

⑦000101010右移(第4次循環)

乘法運算結束後,所得結果共8位,A寄存器中是乘積的高位部分,Q寄存器中是乘積的低位部分,即乘積=0010101=(21)(十進制)

例1.38設被乘數M=0111(7),乘數Q=1101(-3),相乘過程如下:

AQQ-1

000011010初始值

100111010A=A-M

110011101右移(第1次循環)

001111101A=A+M

000111110右移(第2次循環)

101011110A=A-M

110101111右移(第3次循環)

111010111右移(第4次循環)

乘積=11101011=(-21)(十進制)

其中的移位是循環移位.

被乘數n位要移位3次.

上一篇:C波段

下一篇:調音台

相關詞條

相關搜索

其它詞條