打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在单片机中, 64 位整数除以 32 位整数

在单片机中, 64 位整数除以 32 位整数, 因为没有64位寄存器, 所以需要自己实现

  1. // 64 位除以 32 位  
  2. Longword _DivEx(Longword  AHiVal, Longword  ALoVal, Longword ADivisor,  
  3.                 Longword& AHiRet, Longword* ARemainder = NULL)  
  4. {  
  5. /* 
  6.    // 32位值 
  7.    static const Longword _Bit32_[32] = {0x80000000, 0x40000000, 0x20000000, 0x10000000, 
  8.                                         0x08000000, 0x04000000, 0x02000000, 0x01000000, 
  9.                                         0x00800000, 0x00400000, 0x00200000, 0x00100000, 
  10.                                         0x00080000, 0x00040000, 0x00020000, 0x00010000, 
  11.                                         0x00008000, 0x00004000, 0x00002000, 0x00001000, 
  12.                                         0x00000800, 0x00000400, 0x00000200, 0x00000100, 
  13.                                         0x00000080, 0x00000040, 0x00000020, 0x00000010, 
  14.                                         0x00000008, 0x00000004, 0x00000002, 0x00000001}; 
  15. */  
  16.   
  17.    // 初始化  
  18.    Longword result = 0;  
  19.   
  20.    // 判断除数是否为 0, 及高 32 位是否为 0  
  21.    if (ADivisor == 0)  
  22.       throw;  
  23.    else if (AHiVal == 0)  
  24.    {  
  25.       AHiRet = 0;  
  26.       result = ALoVal / ADivisor;  
  27.       if (ARemainder != NULL)  
  28.          *ARemainder = ALoVal % ADivisor;  
  29.    }  
  30.    else  
  31.    {  
  32.       // 初始化  
  33.       Longword dwMod;  
  34.   
  35.       // 取高 32 位结果  
  36.       AHiRet   = AHiVal / ADivisor;  
  37.       dwMod    = AHiVal % ADivisor;  
  38.   
  39.       // 判断最高位是否为 1  
  40.       if (ADivisor >= 0x80000000)  
  41.       {  
  42.          // 初始化  
  43.          bool     boolBit = (dwMod >= 0x80000000);  
  44.          Longword dwValue = ADivisor & 0x7FFFFFFF;  
  45.   
  46.          // 循环操作  
  47.          for (Byte byteBit = 0; byteBit < 32; byteBit++)  
  48.          {  
  49.             result = result << 1;  
  50.             dwMod  = (dwMod << 1) + ((ALoVal >> (31 - byteBit)) & 1);  
  51.             //dwMod = (dwMod << 1) + ((ALoVal & _Bit32_[byteBit]) != 0);  
  52.   
  53.             if (boolBit)  
  54.             {  
  55.                result++;  
  56.                dwMod  ^= 0x80000000;  
  57.                dwMod  -= dwValue;  
  58.                boolBit = (dwMod >= 0x80000000);  
  59.             }  
  60.             else if (dwMod >= ADivisor)  
  61.             {  
  62.                result++;  
  63.                dwMod  -= ADivisor;  
  64.             }  
  65.             else  
  66.                boolBit = (dwMod >= 0x80000000);  
  67.          }  
  68.       }  
  69.       else  
  70.          for (Byte byteBit = 0; byteBit < 32; byteBit++)  
  71.          {  
  72.             result = result << 1;  
  73.             dwMod  = (dwMod << 1) + ((ALoVal >> (31 - byteBit)) & 1);  
  74.             //dwMod = (dwMod << 1) + ((ALoVal & _Bit32_[byteBit]) != 0);  
  75.   
  76.             if (dwMod >= ADivisor)  
  77.             {  
  78.                result++;  
  79.                dwMod -= ADivisor;  
  80.             }  
  81.          }  
  82.   
  83.       // 判断是否需要余数  
  84.       if (ARemainder != NULL)  
  85.          *ARemainder = dwMod;  
  86.    }  
  87.   
  88.    // 返回结果  
  89.    return result;  
  90. }  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【单片机学习】51单片机I/O介绍
使用软件Proteus仿真51单片机的基本方法
手把手教你学单片机 十天学会单片机
单片机
单片机+几个595。想驱动几个就驱动几个。
单片机要怎么学习?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服