以下講解內容出自《計算機組成原理(第三版)》(清華大學出版社)
大二學生一只,我的計組老師比較划水,不講公式推導,所以最近自己研究了下Booth算法的公式推導,希望能讓同樣在研究Booth算法的小伙伴少花點時間。

下面將對上圖公式方框中部分進行講解。
首先要擺明一個公式。
**公式X**: - [B]補 = [-B]補 ; [B]補 = - [-B]補
意思是 一個數A的補碼,等於該補碼的機器負數 (機器負數的定義可以見書P85 簡單理解一個數Y的機器負數 = [-Y]補)
前加負號的數
比如:
01100 (12) - [00101(5)]補 = 01100(12) + 10101(-5的補碼) = (01100 + 11011)(補碼) = 00111 (7的原碼和補碼)
解釋1框框:
因為乘數為小數,0.ABCD = A*(2^(-1)) + B*(2^(-2)) + C*(2^(-3)) + D*(2^(-4))。就和1111 = 1 + 2 + 4 + 8 一個道理。
因為乘數為小數,0.ABCD = A*(2^(-1)) + B*(2^(-2)) + C*(2^(-3)) + D*(2^(-4))。就和1111 = 1 + 2 + 4 + 8 一個道理。
解釋2框框內容:
根據公式X, 第二行的 + [-X] 補 * Ys = - [X]補 * Ys
根據公式X, 第二行的 + [-X] 補 * Ys = - [X]補 * Ys
由此得第三行的 -Ys * [X]補
解釋3框框中的圖:
這個框中的意思是一個二進制小數,向左移動一位(乘2),再減去原來的自己,還是等於自己。利用了二進制 高一位 是 低一位兩倍的關系。
看上圖中,Y1本來是表示Y1*(2^(-1))次方的大小的 ,但是在3框框中卻變成了 1 * Y1(左移了一位), 其他位以此類推。並且減去了表示原來的自己的 Y1*(2^(-1)),結果還是 Y1*(2^(-1)),所以等於原來的自己,其他位以此類推。
這個框中的意思是一個二進制小數,向左移動一位(乘2),再減去原來的自己,還是等於自己。利用了二進制 高一位 是 低一位兩倍的關系。
看上圖中,Y1本來是表示Y1*(2^(-1))次方的大小的 ,但是在3框框中卻變成了 1 * Y1(左移了一位), 其他位以此類推。並且減去了表示原來的自己的 Y1*(2^(-1)),結果還是 Y1*(2^(-1)),所以等於原來的自己,其他位以此類推。
下圖的Zn是部分積,並且把部分積從原式中拆解出來后,可以根據這些拆解式分析出Booth算法一位乘法補碼運算時的過程

藍色框框里的 Y(n+1) - Yn 就是乘數的末兩位了(被乘數移位之后),當 Y(n+1) - Yn = - 1 的時候,
(Y(n+1) - Yn)* [X]補 * 2^(-n) = (-1) * [X]補 * 2^(-n) = + [-X]補碼 * 2^(-n) , X是被乘數,這也可以解釋為什么Booth里末兩位為10時,要加[-X]補 (因為 Y(n+1) = 0, Yn = 1)。 為什么 Y(n+1) - Yn = 1 (末兩位01)的時候 要加[X]補。而Y(n+1) - Yn = 0 (末兩位為11 或者 00)的時候什么都不做(1 - 1 = 0, 0 - 0 = 0)。而 2^(-n) 中的n則是當前部分積相對原來開始時右移的位數,所以(Y(n+1) - Yn)* [X]補 * 2^(-n) 解釋起來就是 (Y(n+1) - Yn) 根據乘數末兩位來確定 -1,0 , 1。也就是加還是減或者什么都不做。[X]補是原來被乘數的補碼,因為乘數Y是1和0組成的,所以整個乘法X*Y的過程就是在決定要不要加X,或者不加的過程,當然補碼運算比較特殊,還有減去操作。而2^(-n)的n則是表示當前乘法部分積移動的位數。
下圖是部分積拆解結果和運算過程的對應關系分析
