1、综合训练项目二 定点运算器设计 目的和规定: 采用BOOTH算法,编程实现二进制数的乘法运算,进而了解计算机中定点运算的过程。程序算法思想: 在第一次判断被乘数0110中的最低位0以及右边的位(辅助位0),得00;所以只进行移位操作;第二次判断0110中的低两位,得10,所以作减法操作并移位,这个减法操作相称于减去2a的值;第三次判断被乘数的中间两位,得11,于是只作移位操作;第四次判断0110中的最高两位,得01,于是作加法操作和移位,这个加法相称于加上8a的值,由于a的值已经左移了三次乘积(R0,R1, P)例如2*(-4)2补=0010, -4补=1100,在乘法开始之前,R0和R1中的
2、初始值为0000和1100,R2中的值为00100初始值0000 1100 0第一次循环1:无操作2:右移1位0000 0110 0第二次循环1b:减00101110 01102:右移1位1111 0011 0第三次循环1:无操作2:右移1位1111 1001 1第四次循环1b:加00100001 10012:右移1位 1000 1100 1流程图:yiyi+1=?开始 01 10第四次循环?乘积寄存器右移一位1b:R0+R2-R000,111c:R0-R2-R01aN完毕Y程序代码:#define _CRT_SECURE_NO_WARNINGS / 定点小数补码一位乘 #include #i
3、nclude #include using namespace std; const int n = 4; / 数值位位数 / a,b联合右移(算术移位) void RightMove(bitset &a, bitset &b, bool &eBit) eBit = b0; b = 1; bn = a0; a = 1; an + 1 = an; / 算术右移 bitset operator+(bitset a, bitset b) / 求a,b的算术和 return a.to_ulong() + b.to_ulong(); /to_ulong()函数用无符号整型的形式返回bitset bits
4、et operator-(bitset a, bitset b) return a.to_ulong() - b.to_ulong(); bitset GetComplement(bitset a) if (an) a = a.to_ulong() + 1; /取反加一 a.set(n); / NOTE return a; bitset GetComplement(const bitset high, const bitset low) / low的最低位舍弃,由于它不属于积,而是本来乘数的符号 bitset ans(high.to_string().substr(1) + low.to_st
5、ring().substr(0, 4); if (ans2 * n) ans = ans.to_ulong() + 1; ans.set(2 * n); / NOTE return ans; enum Sign_00, _01, _10, _11; Sign Test(bool a, bool b) if (!a & !b) return _00; else if (!a & b) return _01; else if (a & !b) return _10; else / if (a & b) / 所有途径都必须返回值 return _11; bitset ComplementOneMul
6、(const bitset X, const bitset Y)/传进被乘数X和乘数Y(原码表达) bitset A; / A放部分积(最后是积的高位) bitset tmp = GetComplement(X).to_ulong(); tmpn + 1 = tmpn; / 注意补码最高位的扩展 const bitset B(tmp); / B是X的补码 /无法运用返回值的不同而重载,故引入tmp bitset C = GetComplement(Y); / C是Y0.Y1Y2.Yn(Y的补码) int cd = n + 1; / cd是计数器 bool Yn1 = 0; while (cd-
7、) switch (Test(C0, Yn1) / 检测Y(i+1)-Y(i) case _00: case _11: break; case _10: A = A - B; break; case _01: A = A + B; break; default: break; if (cd != 0) / 最后一次不移位 RightMove(A, C, Yn1); / A,C联合右移,C的低位移至Yn1 return GetComplement(A, C); bitset DirectMul(const bitset X, const bitset Y) const bitset x(X.to
8、_ulong(); / 用截断高位的方法取绝对值 const bitset y(Y.to_ulong(); bitset ans(x.to_ulong() * y.to_ulong(); ans2 * n = Xn Yn; / 最后单独计算符号位 return ans; int main(int argc, char *argv) string inputStrX; string inputStrY; while (cin inputStrX inputStrY) const bitset X(inputStrX); / X是被乘数 const bitset Y(inputStrY); / Y是乘数 cout ComplementOneMul:t X * Y = ComplementOneMul(X, Y) endl; cout DirectMul:tt X * Y = DirectMul(X, Y) endl endl; return 0; 输入及运营结果: