8位单片机,大数运算,可以运算任意位数的乘除法

发布者:开元轩最新更新时间:2015-11-02 来源: eefocus关键字:8位单片机  大数运算  乘除法 手机看文章 扫描二维码
随时随地手机看文章
#include
 
#include "stdio.h" 
#include "string.h"                 
 
#include "intrins.h"
 
 
#define BIT 10
 
//WriteBy :Rlogin Xukaiming
 
 
void BigNumMul(char szByNum[], char szNum[], char aryResult[])
 
{
 
    int nByNumLen, nNumLen, nTempLen, nResultLen ;
 
    int i,j,k,l;
 
        //结果长度
 
        nByNumLen         =   strlen(szByNum);
 
        nNumLen                =   strlen(szNum);        
        nResultLen  =         nNumLen+ nByNumLen;  
 
    //乘数长度从右向左依次
 
        l =  nResultLen-1;
 
    for (i = nNumLen-1; i >= 0; i--)
 
    {
 
            
 
        nTempLen = l;
 
                
        for (j = nByNumLen-1; j >= 0; j--, nTempLen--)
 
        {
 
            //结果第一次从最后一位开始,第二次从倒数第二位开始放                                                                                           
                        aryResult[nTempLen] = aryResult[nTempLen] + (szNum[i] - '0') * (szByNum[j] -'0');
 
        }
 
        
 
        //进位处理
 
        for (k = l; k >0; k--)                           //从后往前处理
 
        {
 
            if (aryResult[k] > BIT)
 
            {
 
                aryResult[k-1] = aryResult[k-1] + aryResult[k] / BIT;
 
                aryResult[k] = aryResult[k] % BIT;
 
            }
 
        }
 
                //下一次得从倒数第二位开始
 
        l--;
 
   
                                                                                         
 
        for(nResultLen=nResultLen-1;nResultLen>=0;nResultLen--)                //变成字符串
 
        {
 
                aryResult[nResultLen]+='0';
 
                _nop_(); 
        }
 
        
        _nop_();
 
}
 
 
 
void BigNumDiv(char szByNum[], char szNum[], char quotient[],char **remainder )
 
{
 
        int nByNumLen, nNumLen, nTempLen, nResultLen ;        
        int j,k,l=0;
 
        nByNumLen         =   strlen(szByNum);
 
        nNumLen                =   strlen(szNum);        
        nResultLen  =         nByNumLen - nNumLen+1;   //估计商数的长度
 
 
         //将除数和被除数变成10进制数字
 
        for(j=nByNumLen-1;j>=0;j--)
 
        {
 
                szByNum[j] -='0';
 
        }
 
        for(j=nNumLen-1;j>=0;j--)
 
        {
 
                   szNum[j] -= '0';
 
        }
 
        ///////////////////////////////除法就是减法 ?
 
        
        for(j=nResultLen-1;j>=0;j--)
 
        {        
                quotient[l]=0;    
                while(1)
 
                {
 
                        quotient[l]++;                                  //商数加1
 
                        for(k=nNumLen-1;k>=0;k--)         //减除数的长度即可         
 
                        {                                                                 
                                szByNum[k+l]-=szNum[k];          //减掉除数
 
                                if(szByNum[k+l]<0)
 
                                {                                                                     
 
                                        //if((l!=0)||(k+l>1))                //第一次防止借位借到-1位
 
                                        if(k+l>0)
 
                                        {                                   
                                                szByNum[k+l-1]-=1;           //借位=10                 
                                                szByNum[k+l]+=BIT;                                                 
                                       
                                         
 
                                }
 
                                
                        }        //(szByNum[0]<0)||(
 
                        if(((l==0)&&(szByNum[l]<0))                                 //符号判断,看有负数没?
 
                        ||((l>0)&&(szByNum[l-1]<0)))
 
                        {        
                                quotient[l]--;
 
                                for(k=nNumLen-1;k>=0;k--)
 
                                {
 
                                        szByNum[k+l]+=szNum[k];                   //变成了负数,要加回来
 
                                        if(szByNum[k+l]>=BIT)
 
                                        {
 
                                                if(k+l>0)                          //第一次防止借位借到-1位
 
                                                {
 
                                                        szByNum[k+l-1]+=1;
 
                                                        szByNum[k+l]-=BIT;        
                                                }         
 
                                                                                                   
                                        }
 
                                }
 
                                _nop_();
 
                                break;                                          
                        }         
                }         
 
                quotient[l]+='0';   //转为ASCII
 
                l++; 
                
        }
 
        for(j=l;j
 
        {
 
                szByNum[j]+='0';
 
        }
 
        *remainder = &szByNum[l];
 
        quotient[l] = '';
 
}
[page]
 
xdata char strByNum[8], strNum[8];          
 
xdata char arrayResult[50] = {0};
 
 
xdata char arrayquotient[8];
 
xdata char *arrayremainder;
 
 
int main()
 
{
 
 
    int i;
 
 
        TH1 = 0xFE;
 
        TR1 = 1;
 
    TI = 1;
 
 
    //printf("请输入被乘数: ");
 
        strcpy(strByNum,"9000");                         
 
    printf(" 被除数: ");
 
        printf(strByNum);
 
        strcpy(strNum,"299");
 
        printf(" 除数: ");
 
        printf(strNum);                
        //strcpy(arrayquotient,"123");
 
        memset(arrayResult,0,sizeof(arrayResult));            
 
    //BigNumMul(strByNum, strNum, arrayResult);         
 
           BigNumDiv(strByNum, strNum, arrayquotient,&arrayremainder);         
 
    printf(" 商数: ");
 
    printf(arrayquotient); 
        printf(" 余数: ");
 
        printf(arrayremainder); 
    printf(" ");        
        while(1);          
 
    return 0;
 
}
 
输入输出均为10进制 字符串

应用范围 ,加密解密,DDS的超长的除法
 
 
这是一个C语言版本,只供学习参考,实际使用可找汇编版本。。。字符串法!!!

关键字:8位单片机  大数运算  乘除法 引用地址:8位单片机,大数运算,可以运算任意位数的乘除法

上一篇:单片机控制斯泰普步进电机驱动器工作原理
下一篇:单片机c语言中的左移右移

推荐阅读最新更新时间:2024-03-16 14:38

采用8位单片机驱动PCI总线网卡的设计方案
目前,以太网(Ethernet)协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络、因特网等场合,并且还不断地在发展。单片机或微控制器(MCU)(也称为嵌入式系统)已经在各个领域得到了广泛的应用。目前绝大多数系统都是以MCU为核心,与监测、伺服、指示设备配合实现一定的功能。如果嵌入式系统能够连接到Internet,则可以方便、低廉地将信息传送到世界上的任何一个地方。因此单片机如何控制以太网网卡进行传输数据,如何加载TCP/IP协议连接到互联网,这些都是一些具有挑战性的问题[1,2]。 单片机上网研究最多的一个方案就是用单片机驱动ISA总线网卡或者是驱动基于ISA总线的以太网控制芯片。但是,近年来,随着ISA总线在台
[单片机]
Small RTOS51实现基于8位单片机的温控器设计
目前,8位单片机在测控领域和智能化电子产品应用中仍占有重要地位.而应用嵌入式实时操作系统(ERTOS)会对8位单片机的软件开发带来极大方便。在此简要介绍嵌入式实时操作系统及其在程序设计中的优越性,重点介绍了适合于小RAM单片机的嵌入式实时操作系统Small RTOS51,以及基于8位单片机的硬件和软件的设计方法和过程。 1 嵌入式实时操作系统Small RTOS51简介 嵌入式系统已成为当今的热门话题之一,从消费类电子产品到各种工业设备,嵌入式系统已渗透到日常生活的各个角落。对于嵌人式系统,一个重要的特征是实时性,即在确定的时间内完成规定的功能,并能对外部异步事件做出正确响应。确保系统的实时性,需要软硬件配合来完成
[单片机]
STM32F4制作一个计算器(一) 大数运算
一、大数的运算算法 使用原子的STM32F4开发板制作一个计算器,类似电脑上的标准型计算器。 在制作界面之前,首先要解决大数运算问题。因为STM32为32位MCU,直接计算最大不过32位,按十进制也就是10位数,显然不够用。 为了方便计算,使用数组储存各位数据,并且低位在前。下面数据结构中,使用指针代替数组,这是为了方便以后与界面函数部分对接。 #define THIS_MAXLEN 50 //数组长度 #define SHOW_MAXLEN 30 //自我调整中使用的最大长度 #define DIV_PREC 20 //除法精度相关 #define RESULT_TYPE signed char #define RE
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved