1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 综合训练项目二 定点运算器设计 目的和要求: 采用BOOTH算法, 编程实现二进制数的乘法运算, 进而了解计算机中定点运算的过程。 程序算法思想: 在第一次判断被乘数0110中的最低位0以及右边的位(辅助位0), 得00; 因此只进行移位操作; 第二次判断0110中的低两位, 得10, 因此作减法操作并移位, 这个减法操作相当于减去2a的值; 第三次判断被乘数的中间两位, 得11, 于是只作移位操作; 第四次判断0110中的最高两位, 得01, 于是作
2、加法操作和移位, 这个加法相当于加上8a的值, 因为a的值已经左移了三次 乘积( R0,R1, P) 例如2*(-4) [2]补=0010, [-4]补=1100, 在乘法开始之前, R0和R1中的初始值为0000和1100, R2中的值为0010 0 初始值 0000 1100 0 第一次循环 1: 无操作 2:右移1位 0000 0110 0 第二次循环 1b: 减0010 1110 0110 2: 右移1位 1111 0011 0 第三次循环 1: 无操作 2: 右移1位 1111 1001 1 第四次循环 1b: 加0010 0001 1
3、001 2: 右移1位 1000 1100 1 流程图: yiyi+1=? 开始 01 10 第四次循环? 乘积寄存器右移一位 1b:R0+R2->R0 00,11 1c:R0-R2->R0 1a N 完成 Y 程序代码: #define _CRT_SECURE_NO_WARNINGS // 定点小
4、数补码一位乘
#include
5、 a[0];
a >>= 1;
a[n + 1] = a[n]; // 算术右移
}
bitset
6、o_ulong() - b.to_ulong();
}
bitset
7、ow的最低位舍弃, 因为它不属于积, 而是原来乘数的符号 { bitset<2 * n + 1> ans(high.to_string().substr(1) + low.to_string().substr(0, 4)); if (ans[2 * n]) { ans = ~ans.to_ulong() + 1; ans.set(2 * n); // NOTE } return ans; } enum Sign{_00, _01, _10, _11}; S
8、ign 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; } } b
9、itset<2 * n + 1> ComplementOneMul(const bitset
10、最高位的扩展
const bitset
11、 { switch (Test(C[0], Yn1)) // 检测Y(i+1)-Y(i) { case _00: case _11: break; case _10: A = A - B; break; case _01: A = A + B; break; default: br
12、eak;
}
if (cd != 0) // 最后一次不移位
{
RightMove(A, C, Yn1); // A,C联合右移, C的低位移至Yn1
}
}
return GetComplement(A, C);
}
bitset<2 * n + 1> DirectMul(const bitset
13、o_ulong()); // 用截断高位的方法取绝对值
const bitset
14、le (cin >> inputStrX >> inputStrY)
{
const bitset






