自己写的booth算法实现比较简陋大神将就看有俩函数进不去求帮忙瞅瞅

生查子月 2015-11-23 05:52:58
//Booth实现定点补码一位乘,请直接输入被乘数与乘数的补数形式!!!!记得要切换输入法
//只做小数部分四位的操作

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int N = 0; //记录移位的次数
int Yn = 0;//附加位

void Multiply(char X1[], char X2[], char product[], char minus[]);
void RMove(char *partproduct, char*X2);//乘数右移操作,返回移丢的位Y
void Minus(char X1[], char minus[]);//求【-X】的补数
void Plus(char partproduct[], char X1[], char X2[], char minus[]);//加法
void main()
{
string muled, muler;
getline(cin, muled, ',');
getline(cin, muler, '\n');

char minus[8];//[-x]的补数
char product[11];//积
char X1[8], X2[6];
if (muled[0] == '0') X1[0] = '0';
else X1[0] = '1';
if (muler[0] == '0') X2[0] = '0';
else X2[0] = '1';
for (int i = 1, j = 0; j <= 6; i++, j++)
X1[i] = muled[j];
for (int i = 1, j = 2; j <= 6; i++, j++)
X2[i] = muler[j];
Minus(X1, minus);
Multiply(X1, X2, product, minus);

}
void Minus(char X1[], char minus[])
{
for (int i = 0; i < 8; i++)
{
if (X1[i] == '0') minus[i] = '1';
else if (X1[i] == '1') minus[i] = '0';
else minus[i] = X1[i];
}
for (int i = 6; i >= 0; i--)
{
if (minus[i] == '0')
{
minus[i] = '1';
break;
}
else
minus[i] = '0';
}
}
void Plus(char partproduct[], char X1[], char X2[], char minus[])
{
int carry = 0;//表示进位
int i = 6, j = 4;
int a, b, c;
if (Yn - (int)X2[4] + '0' == 1)
{
while (partproduct[i] != '.'){
a = partproduct[i] - '0';

b = X1[j] - '0';
c = a^b;
c = c^carry;
partproduct[i] = c + '0';
if (a + b + carry>1) carry = 1;
else carry = 0;
}
}
if (Yn - (int)X2[4] + '0' == -1)
{
while (partproduct[i] != '.'){
a = partproduct[i] - '0';

b = minus[j] - '0';
c = a^b;
c = c^carry;
partproduct[i] = c + '0';
if (a + b + carry>1) carry = 1;
else carry = 0;
}
}
if (carry == 1)
{
for (int i = 1; i >= 0; i--)
{
if (partproduct[i] == '0')
{
partproduct[i] = '1';
break;
}
else partproduct[i] = '0';
}
}
}
void RMove(char *partproduct, char*X2) //右移
{
Yn = (int)X2[4] - '0'; //附加位,用于判断位移及加减
X2[0] = partproduct[6];//部分积的最后一位移到乘数寄存器中保存
for (int i = 4; i>N; i--)
X2[i] = X2[i - 1];
for (int j = 6; j > 3; j--)
partproduct[j] = partproduct[j - 1];

if (partproduct[0] == '1')
partproduct[3] = '1';
else
partproduct[3] = '0';

N++;
}
void Multiply(char X1[], char X2[], char product[], char minus[])
{
char partproduct[8] = "00.0000";
for (; N < 3;)
{
int C = Yn - (int)X2[4] + '0';
switch (C)
{
case 0: RMove(partproduct, X2); break;
case 1:{ Plus(partproduct, X1, X2, minus); RMove(partproduct, X2); break; }
case -1:{Plus(partproduct, X1, X2, minus); RMove(partproduct, X2); break; }
}
}

strcpy_s(product, strlen(partproduct), partproduct);
for (int i = 0; i < strlen(partproduct); i++)
product[i] = product[i + 1];
product[strlen(partproduct)] = '\0';
X2[4] = '\0';
strcat_s(product, strlen(X2), X2);
}
...全文
425 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
极客创工 2018-10-22
  • 打赏
  • 举报
回复
当时什么水平?

2,425

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧