//multiply.h
#ifndef MULTIPLY_H_
#define MULTIPLY_H_
#define LO(x) x & 0x0000FFFF
#endif
//multiply.cpp
#include"multiply.h"
#include
#include
#include
#include
#include
#define MAXSIZE 10000
#define TestLength 100
typedef unsigned short WORD;
//一个WORD中放16位二进制
void Multiply(WORD *R,WORD *A,WORD *B,unsigned int N)
{
int i, j;
int posR;
unsigned Result;
//结果值每个元素值清零
for(i=0;i<2*MAXSIZE+1;i++)
R[i]=0;
for(i=N-1; i>=0; --i)
{
//0参与计算,结果为0,直接跳过
unsigned carry = 0;//进位
if(A[i] == 0)
continue;
for(j=N-1; j>=0; --j)
{
if(A[j] == 0)
continue;
//计算结果存放的位置
posR =2*MAXSIZE+1 - N- N + 1 + i + j;;
Result = (int)A[i]*B[j] + carry;
Result += R[posR];
R[posR] = LO(Result);
carry = Result>>16;
}
//存储最后一次计算的进位
R[posR-1] = carry;
}
i=0;
printf("R=");
// 跳过前导0
while(i<2*MAXSIZE && R[i]==0)
++i;
//输出第一个非0数值
printf("%X", R[i++]);
//4位固定域宽输出结果
for(i; i<2*MAXSIZE+1; ++i)
printf("%04X",R[i]);
printf("\n");
}
//将a中的二进制字符16个为一个单位转化为整型放在A数组元素中
void StringToInt(char *a,unsigned short A[],int times,int Len)
{ int i,j,l,k;
for(i=times-1;i>=0;i--)
{
k=0;l=0;
for(j=Len-1;j>=0;j--)
{
//将16个二进制字符转化为整型
A[i]=(int)(A[i]+(a[j]-'0')*pow(2,l));
l++;
k++;
if(k>=16)
break;
}
Len = Len - 16;
}
}
int main()
{
//两个数的长度相同 ,a,b两个数组接收二进制串
char a[MAXSIZE],b[MAXSIZE];
//将每个二进制串从末尾开始,16个为一个单位转化为整型,放在一个整型数组A和B中
unsigned short A[MAXSIZE],B[MAXSIZE],C[2*MAXSIZE+1];
unsigned short M[MAXSIZE],N[MAXSIZE];//用于存放测试用的的乘数与被乘数
unsigned short D[2*MAXSIZE+1];//存放M和N的乘积
int LenA,LenB,i,j,k,l;
int times;
//输入一二进制字符串
printf("Please input the first binary number:\n");
scanf("%s",&a);
LenA=strlen(a);
//进行纠错 ,不允许输入不合法的字符
for(i=0;i<=LenA-1;i++)
{
if((a[i]-'0')<0||(a[i]-'0')>1)
{
printf("It is not right,please input the first number again\n");
scanf("%s",a);
LenA=strlen(a);
i=-1;
}
}
//根据输入字符串的长度,确定Multiply函数中N的数值 ,即循环的次数
if(LenA%16==0)
times=LenA/16;
else
times=(LenA/16)+1;
//初始化A数组的值
for(i=times-1;i>=0;i--)
A[i]=0;
//处理a每16位字符,计算十进制的和,放入一个整型数组元素A中
StringToInt(a,A,times,LenA);
//输入另一个二进制字符串
printf("Please input the second binary number:\n");
scanf("%s",&b);
LenB=strlen(b);
//进行纠错
for(i=0;i<=LenB-1;i++)
{
if((b[i]-'0')<0||(b[i]-'0')>1)
{
printf("It is not right,please input the second number again\n");
scanf("%s",b);
LenB=strlen(b);
i=-1;
}
}
//初始化A数组的值
for(i=times-1;i>=0;i--)
B[i]=0;
//处理b每16位字符,计算十进制的和,放入一个整型数组元素B中
StringToInt(b,B,times,LenB);
Multiply(C,A,B,times);
//以下是测试程序,以二进制的160个1和160个0相乘为例 ,因为整型数组的元素每个
//字长为16,所以只需要十个元素
printf("******************************************************");
printf("\nThe Following is The Binary Testing Section\n");
for(i=0;i<10;i++)
{
M[i]=0;
N[i]=0;
}
//初始化两个乘数的值
char C_TestArrayA[]={
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1'};
char C_TestArrayB[]={
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
//转化为整型,放在整型数组M和N中
StringToInt(C_TestArrayA,M,10,160);
StringToInt(C_TestArrayB,N,10,160);
printf("\n");
printf("The first Testing: 160个1乘以160个1(二进制的1)\n");
Multiply(D,M,M,10);
printf("\n");
printf("The second Testing: 160个0乘以160个0(二进制的0)\n");
Multiply(D,N,N,10);
printf("\n");
printf("The third Testing: 160个1乘以160个0(二进制的1)\n");
Multiply(D,M,N,10);
system("pause");
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/721601/viewspace-751465/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/721601/viewspace-751465/