1、综合训练项目二 定点运算器设计 目的和规定: 采用BOOTH算法,编程实现二进制数的乘法运算,进而了解计算机中定点运算的过程。 程序算法思想: 在第一次判断被乘数0110中的最低位0以及右边的位(辅助位0),得00;所以只进行移位操作;第二次判断0110中的低两位,得10,所以作减法操作并移位,这个减法操作相称于减去2a的值;第三次判断被乘数的中间两位,得11,于是只作移位操作;第四次判断0110中的最高两位,得01,于是作加法操作和移位,这个加法相称于加上8a的值,由于a的值已经左移了三次 乘积(R0,R1, P)
2、 例如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 1001 2:右移1位 1000 1100 1 流程图: yiyi+1=? 开始
3、
01 10
第四次循环?
乘积寄存器右移一位
1b:R0+R2->R0
00,11
1c:R0-R2->R0
1a
N
完毕
Y
程序代码:
#define _CRT_SECURE_NO_WARNINGS // 定点小数补码一位乘
#include
4、ude
5、bitset
6、
7、ring().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}; Sign Test(bool a, bool b) { if (!a && !b) { retu
8、rn _00;
}
else if (!a && b)
{
return _01;
}
else if (a && !b)
{
return _10;
}
else // if (a && b) // 所有途径都必须返回值
{
return _11;
}
}
bitset<2 * n + 1> ComplementOneMul(const bitset 9、 + 1> Y)//传进被乘数X和乘数Y(原码表达)
{
bitset 10、码 //无法运用返回值的不同而重载,故引入tmp
bitset 11、 case _00: case _11:
break;
case _10:
A = A - B;
break;
case _01:
A = A + B;
break;
default:
break;
}
if (cd != 0) // 最后一次不移位
{
12、 RightMove(A, C, Yn1); // A,C联合右移,C的低位移至Yn1
}
}
return GetComplement(A, C);
}
bitset<2 * n + 1> DirectMul(const bitset 13、<2 * n + 1> ans(x.to_ulong() * y.to_ulong());
ans[2 * n] = X[n] ^ Y[n]; // 最后单独计算符号位
return ans;
}
int main(int argc, char **argv)
{
string inputStrX;
string inputStrY;
while (cin >> inputStrX >> inputStrY)
{
const bitset 14、tStrX); // X是被乘数
const bitset
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818