微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第64节:大数据的乘法运算

第64节:大数据的乘法运算

时间:11-22 来源:互联网 点击:

  1. return DataLength;
  2. }
  3. /* 注释六:
  4. *函数介绍:两个数相加
  5. *输入参数:
  6. *(1)*destData--被加数的数组。
  7. *(2)*sourceData--加数的数组。
  8. *(3)*resultData--和的数组。注意,调用本函数前,必须先把这个数组清零
  9. *返回值:10代表计算结果超出范围出错,11代表正常。
  10. */
  11. uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  12. {
  13. uchar addResult=11; //开始默认返回的运算结果是正常
  14. uchar destCnt=0;
  15. uchar sourceCnt=0;
  16. uchar i;
  17. uchar carryData=0;//进位
  18. uchar maxCnt=0; //最大位数
  19. uchar resultTemp=0; //存放临时运算结果的中间变量
  20. //为什么不在本函数内先把resultData数组清零?因为后面章节中的乘法运算中要用到此函数实现连加功能。
  21. //因此如果纯粹实现加法运算时,在调用本函数之前,必须先在外面把和的数组清零,否则会计算出错。
  22. destCnt=GetDataLength(destData,BCD8_MAX); //获取被加数的有效位数
  23. sourceCnt=GetDataLength(sourceData,BCD8_MAX);//获取加数的有效位数
  24. if(destCnt>=sourceCnt)//找出两个运算数据中最大的有效位数
  25. {
  26. maxCnt=destCnt;
  27. }
  28. else
  29. {
  30. maxCnt=sourceCnt;
  31. }
  32. for(i=0;i
  33. {
  34. resultTemp=destData[i]+sourceData[i]+carryData; //按位相加
  35. resultData[i]=resultTemp%10; //截取最低位存放进保存结果的数组
  36. carryData=resultTemp/10; //存放进位
  37. }
  38. resultData[i]=carryData;
  39. if((maxCnt==BCD8_MAX)&&(carryData==1))//如果数组的有效位是最大值并且最后的进位是1,则计算溢出报错
  40. {
  41. ClearAllData(BCD8_MAX,resultData);
  42. addResult=10;//报错
  43. }
  44. return addResult;
  45. }
  46. /* 注释七:
  47. *函数介绍:数组向大索引值移位,移一位相当于放大10倍
  48. *输入参数:*destData--被移位的数组。
  49. *输入参数:enlarge_cnt--被移位的个数。
  50. */
  51. void EnlargeData(uchar *destData,uchar enlarge_cnt)
  52. {
  53. uchar i;
  54. if(enlarge_cnt!=0)
  55. {
  56. for(i=0;i<(BCD8_MAX-enlarge_cnt);i++)
  57. {
  58. destData[BCD8_MAX-1-i]=destData[BCD8_MAX-1-enlarge_cnt-i];
  59. }
  60. for(i=0;i
  61. {
  62. destData[i]=0;
  63. }
  64. }
  65. }
  66. /* 注释八:
  67. *函数介绍:两个数相乘
  68. *输入参数:
  69. *(1)*destData--被乘数的数组。
  70. *(2)*sourceData--乘数的数组。
  71. *(3)*resultData--积的数组。
  72. *返回值:10代表计算结果超出范围出错,11代表正常。
  73. */
  74. uchar MultData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  75. {
  76. uchar multResult=11; //开始默认正常
  77. uchar destCnt=0;
  78. uchar sourceCnt=0;
  79. uchar i;
  80. uchar j;
  81. uchar carryData=0;//进位
  82. uchar resultTemp=0; //存放临时运算结果的中间变量
  83. uchar nc_add_result;//接收相加的运算是否超出范围,这里不用判断,因为不会溢出
  84. uchar multArrayTemp[BCD8_MAX]; //存放临时运算结果的数组中间变量
  85. destCnt=GetDataLength(destData,BCD8_MAX); //获取被乘数的长度
  86. sourceCnt=GetDataLength(sourceData,BCD8_MAX); //获取乘数的长度
  87. ClearAllData(BCD8_MAX,resultData); //清零存储的结果
  88. if((0==destCnt)||(0==sourceCnt)) //被乘数或者乘数为0,则结果为0
  89. {
  90. return multResult;
  91. }
  92. if((destCnt+sourceCnt+2)>BCD8_MAX)
  93. {
  94. multResult=10; //运算结果有可能超范围报错
  95. return multResult;
  96. }
  97. for(i=0;i
  98. {
  99. carryData=0; //清零进位
  100. ClearAllData(BCD8_MAX,multArrayTemp); //清零一位乘数相乘的结果中间变量数组
  101. for(j=0;j
  102. {
  103. resultTemp=destData[j]*sourceData[i]+carryData;//乘数的一位依次与被乘数各位相乘,并且加进位
  104. multArrayTemp[j]=resultTemp%10;//存储一位乘数相乘的结果
  105. carryData=resultTemp/10; //保存进位
  106. }
  107. multArrayTemp[j]=carryData; //存储最后的进位
  108. EnlargeData(multArrayTemp,i); //移位。移一次相当于放大10倍。
  109. nc_add_result=AddData(resultData,multArrayTemp,resultData); //把一位乘数相乘的结果存储进总结果
  110. }
  111. return multResult;
  112. }
  113. void usart_service(void)//串口服务程序,在main函数里
  114. {
  115. unsigned char i=0;
  116. unsigned char k=0;
  117. unsigned char ucGetDataStep=0;
  118. if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
  119. {
  120. ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
  121. //下面的代码进入数据协议解析和数据处理的阶段
  122. uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
  123. while(uiRcMoveIndex
  124. {
  125. if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMove

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top