第64节:大数据的乘法运算
时间:11-22
来源:互联网
点击:
- return DataLength;
- }
- /* 注释六:
- *函数介绍:两个数相加
- *输入参数:
- *(1)*destData--被加数的数组。
- *(2)*sourceData--加数的数组。
- *(3)*resultData--和的数组。注意,调用本函数前,必须先把这个数组清零
- *返回值:10代表计算结果超出范围出错,11代表正常。
- */
- uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData)
- {
- uchar addResult=11; //开始默认返回的运算结果是正常
- uchar destCnt=0;
- uchar sourceCnt=0;
- uchar i;
- uchar carryData=0;//进位
- uchar maxCnt=0; //最大位数
- uchar resultTemp=0; //存放临时运算结果的中间变量
- //为什么不在本函数内先把resultData数组清零?因为后面章节中的乘法运算中要用到此函数实现连加功能。
- //因此如果纯粹实现加法运算时,在调用本函数之前,必须先在外面把和的数组清零,否则会计算出错。
- destCnt=GetDataLength(destData,BCD8_MAX); //获取被加数的有效位数
- sourceCnt=GetDataLength(sourceData,BCD8_MAX);//获取加数的有效位数
- if(destCnt>=sourceCnt)//找出两个运算数据中最大的有效位数
- {
- maxCnt=destCnt;
- }
- else
- {
- maxCnt=sourceCnt;
- }
- for(i=0;i
- {
- resultTemp=destData[i]+sourceData[i]+carryData; //按位相加
- resultData[i]=resultTemp%10; //截取最低位存放进保存结果的数组
- carryData=resultTemp/10; //存放进位
- }
- resultData[i]=carryData;
- if((maxCnt==BCD8_MAX)&&(carryData==1))//如果数组的有效位是最大值并且最后的进位是1,则计算溢出报错
- {
- ClearAllData(BCD8_MAX,resultData);
- addResult=10;//报错
- }
- return addResult;
- }
- /* 注释七:
- *函数介绍:数组向大索引值移位,移一位相当于放大10倍
- *输入参数:*destData--被移位的数组。
- *输入参数:enlarge_cnt--被移位的个数。
- */
- void EnlargeData(uchar *destData,uchar enlarge_cnt)
- {
- uchar i;
- if(enlarge_cnt!=0)
- {
- for(i=0;i<(BCD8_MAX-enlarge_cnt);i++)
- {
- destData[BCD8_MAX-1-i]=destData[BCD8_MAX-1-enlarge_cnt-i];
- }
- for(i=0;i
- {
- destData[i]=0;
- }
- }
- }
- /* 注释八:
- *函数介绍:两个数相乘
- *输入参数:
- *(1)*destData--被乘数的数组。
- *(2)*sourceData--乘数的数组。
- *(3)*resultData--积的数组。
- *返回值:10代表计算结果超出范围出错,11代表正常。
- */
- uchar MultData(const uchar *destData,const uchar *sourceData,uchar *resultData)
- {
- uchar multResult=11; //开始默认正常
- uchar destCnt=0;
- uchar sourceCnt=0;
- uchar i;
- uchar j;
- uchar carryData=0;//进位
- uchar resultTemp=0; //存放临时运算结果的中间变量
- uchar nc_add_result;//接收相加的运算是否超出范围,这里不用判断,因为不会溢出
- uchar multArrayTemp[BCD8_MAX]; //存放临时运算结果的数组中间变量
- destCnt=GetDataLength(destData,BCD8_MAX); //获取被乘数的长度
- sourceCnt=GetDataLength(sourceData,BCD8_MAX); //获取乘数的长度
- ClearAllData(BCD8_MAX,resultData); //清零存储的结果
- if((0==destCnt)||(0==sourceCnt)) //被乘数或者乘数为0,则结果为0
- {
- return multResult;
- }
- if((destCnt+sourceCnt+2)>BCD8_MAX)
- {
- multResult=10; //运算结果有可能超范围报错
- return multResult;
- }
- for(i=0;i
- {
- carryData=0; //清零进位
- ClearAllData(BCD8_MAX,multArrayTemp); //清零一位乘数相乘的结果中间变量数组
- for(j=0;j
- {
- resultTemp=destData[j]*sourceData[i]+carryData;//乘数的一位依次与被乘数各位相乘,并且加进位
- multArrayTemp[j]=resultTemp%10;//存储一位乘数相乘的结果
- carryData=resultTemp/10; //保存进位
- }
- multArrayTemp[j]=carryData; //存储最后的进位
- EnlargeData(multArrayTemp,i); //移位。移一次相当于放大10倍。
- nc_add_result=AddData(resultData,multArrayTemp,resultData); //把一位乘数相乘的结果存储进总结果
- }
- return multResult;
- }
- void usart_service(void)//串口服务程序,在main函数里
- {
- unsigned char i=0;
- unsigned char k=0;
- unsigned char ucGetDataStep=0;
- if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
- {
- ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
- //下面的代码进入数据协议解析和数据处理的阶段
- uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
- while(uiRcMoveIndex
- {
- if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMove
大数据乘法运 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)