第六章20. 用原码一位乘、两位乘和补码一位乘(Booth 算法) 、两位乘计算 x·y (1)x= 0.110111,y= -0.101110 ; (2)x= -0.010111,y= -0.010101; (3)x= 19, y= 35; (4)x= 0.110 11, y= -0.111 01 解:(a) 原码一位乘:(1)[x]原=0.110111[y]原=1.101110x*=0.110111y*=0.101110符号位: 0XY1数值部分的计算:部分积 乘数 y*----------------------------------------------------------------------------------------------------------------------0.000000 101110 开始部分积为 0+ 0.000000 乘数为 0,加上 0----------------------------------------------------------------------------------------------------------------------0.0000000.000000 0 10111 部分积右移一位,乘数右移一位+ 0.110111 乘数为 1,加上 X*----------------------------------------------------------------------------------------------------------------------0.110111 00.011011 10 1011 部分积右移一位,乘数右移一位+ 0.110111 乘数为 1,加上 X*---------------------------------------------------------------------------------------------------------------------1.010010 100.101001 010 101 部分积右移一位,乘数右移一位+ 0.110111 乘数为 1,加上 X*---------------------------------------------------------------------------------------------------------------------1.100000 0100.110000 0010 10+ 0.000000--------------------------------------------------------------------------------------------------------------------0.110000 00100.011000 00010 1 部分积右移一位,乘数右移一位+ 0.110111 乘数为 1,加上 X*---------------------------------------------------------------------------------------------------------------------1.001111 00010 右移一位0.100111 100010[x*y]原=1.100111100010(2)[x]原=1.010111[y]原=1.010101x*=0.010111y*=0.010101符号位: 0XY10数值部分的计算:部分积 乘数 y*0.000000 010101 开始部分积为 0+ 0.010111 乘数为 1,加上 X*0.0101110.001011 1 01010 部分积右移一位,乘数右移一位+ 0.000000 乘数为 0,加上 00.001011 10.000101 11 0101 部分积右移一位,乘数右移一位+ 0.010111 乘数为 1,加上 X*0.011100 110.001110 011 010 部分积右移一位,乘数右移一位+ 0.000000 乘数为 0,加上 00.001110 0110.000111 0011 01 部分积右移一位,乘数右移一位+ 0.010111 乘数为 1,加上 X*0.011110 00110.001111 00011 0 部分积右移一位,乘数右移一位+ 0.0000000.001111 000110.000111 100011故,x·y=0.000111100011(3)[x]原=0,0001 0011[y]原=0,0010 0011x*=0001 0011y*=0010 0011符号位: 0XY0数值部分的计算:部分积 乘数 y*00000000 00100011 开始部分积为 0+ 00010011 乘数为 1,加上 X*0001001100001001 1 0010001 部分积右移一位,乘数右移一位+ 0001001100011100 100001110 01 001000 部分积右移一位,乘数右移一位+ 0000000000001110 0100000111 001 00100 部分积右移一位,乘数右移一位00000011 1001 0010 00000001 11001 001+ 0001001100010100 10001 0000000101 0011001即 0,0000 0010 1001 1001(4)x=0.11011,y=-0.11101[x]原=0.11011[y]原=1.11101x*=0.11011y*=0.11101符号位: 0XY1数值部分的计算:部分积 乘数 y*0.00000 11101 开始部分积为 0+ 0 .11011 乘数为 1,加上 X*0.110110.01101 1 1110 部分积右移一位,乘数右移一位0.00110 11 111 部分积右移一位,乘数右移一位+ 0.110111.00001 110.10000 111 11 部分积右移一位,乘数右移一位+ 0.11011 乘数为 1,加上 X*1.01011 1110.10101 1111 1 部分积右移一位,乘数右移一位+ 0.11011 乘数为 1,加上 X*1.10000 11110.11000 01111加上符号位得1.1100001111(b) 补码一位乘(Booth)当乘数 y 为正数时,不管被乘数 x 符号如何,都可按原码乘法的规则运算,但加和移位都必须按补码规则运算当乘数 y 为负数时,把乘数的补码[y]补去掉符号位,当成一个正数与 [x]补相乘,然后加上[-x] 补进行校正。
Booth 算法的部分积取双符号位,乘数因符号位参加运算,故多取一位Comment [木木木木1]: 右移一位,添 1Comment [木木木木2]: 右移一位,添 0Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作判断的两个数据位为当前位及其右边的位( 初始时需要增加一个辅助位 0),移位操作是向右移动补码一位乘法则(教材 P254)1iy1iiy操作00 0 部分积右移一位01 1 部分积加[x]补,再右移一位10 -1 部分积加[-x] 补,再右移一位11 0 部分积右移一位(1)[x]补=0.110111[y]补=1.010010部分积 乘数 y[n] 辅助位 y[n+1]00.0000001010010 0 初始 0, 1iy=00,右移一位00.0000000 101001 0 i=10,加[-x]补,右移一位- 00.110111-----------------------------------11.001001011.10010010 10100 1 1iy=01,加[x]补,右移一位+ 00.110111-----------------------------------00.0110111000.001101110 1010 0 1iy=00,右移一位00.0001101110 101 0 i=10,加[-x]补,右移一位- 00.110111-----------------------------------11.001111111011.10011111110 10 1 1iy=01,加[x]补,右移一位+ 00.110111-----------------------------------00.0111101111000.001111011110 1 0 1iy=10,加[-x]补,右移一位- 00.110111-----------------------------------11.011000011110[x·y]补=1.011000011110则 X·Y=1.1001 1110 0010(2)[x]补=1.101001[y]补=1.101011 部分积 乘数 y[n] 00.000000 1101011 0 辅助位 y[n+1] 1iy=10,加[-x]补,右移一位- 11.101001 00.01011100.001011 1 110101 1 辅助位 y[n+1] 1iy=11,右移一位00.000101 11 11010 1 辅助位 y[n+1] i=01,加[x] 补,右移一位+ 11.101001 11.101110 1111.110111 011 1101 0 - 11.10100100.001110 01100.000111 0011 110 1 + 11.10100111.110000 001111.111000 00011 11 0 - 11.101。