在单片机中, 64 位整数除以 32 位整数, 因为没有64位寄存器, 所以需要自己实现
- // 64 位除以 32 位
- Longword _DivEx(Longword AHiVal, Longword ALoVal, Longword ADivisor,
- Longword& AHiRet, Longword* ARemainder = NULL)
- {
- /*
- // 32位值
- static const Longword _Bit32_[32] = {0x80000000, 0x40000000, 0x20000000, 0x10000000,
- 0x08000000, 0x04000000, 0x02000000, 0x01000000,
- 0x00800000, 0x00400000, 0x00200000, 0x00100000,
- 0x00080000, 0x00040000, 0x00020000, 0x00010000,
- 0x00008000, 0x00004000, 0x00002000, 0x00001000,
- 0x00000800, 0x00000400, 0x00000200, 0x00000100,
- 0x00000080, 0x00000040, 0x00000020, 0x00000010,
- 0x00000008, 0x00000004, 0x00000002, 0x00000001};
- */
-
- // 初始化
- Longword result = 0;
-
- // 判断除数是否为 0, 及高 32 位是否为 0
- if (ADivisor == 0)
- throw;
- else if (AHiVal == 0)
- {
- AHiRet = 0;
- result = ALoVal / ADivisor;
- if (ARemainder != NULL)
- *ARemainder = ALoVal % ADivisor;
- }
- else
- {
- // 初始化
- Longword dwMod;
-
- // 取高 32 位结果
- AHiRet = AHiVal / ADivisor;
- dwMod = AHiVal % ADivisor;
-
- // 判断最高位是否为 1
- if (ADivisor >= 0x80000000)
- {
- // 初始化
- bool boolBit = (dwMod >= 0x80000000);
- Longword dwValue = ADivisor & 0x7FFFFFFF;
-
- // 循环操作
- for (Byte byteBit = 0; byteBit < 32; byteBit++)
- {
- result = result << 1;
- dwMod = (dwMod << 1) + ((ALoVal >> (31 - byteBit)) & 1);
- //dwMod = (dwMod << 1) + ((ALoVal & _Bit32_[byteBit]) != 0);
-
- if (boolBit)
- {
- result++;
- dwMod ^= 0x80000000;
- dwMod -= dwValue;
- boolBit = (dwMod >= 0x80000000);
- }
- else if (dwMod >= ADivisor)
- {
- result++;
- dwMod -= ADivisor;
- }
- else
- boolBit = (dwMod >= 0x80000000);
- }
- }
- else
- for (Byte byteBit = 0; byteBit < 32; byteBit++)
- {
- result = result << 1;
- dwMod = (dwMod << 1) + ((ALoVal >> (31 - byteBit)) & 1);
- //dwMod = (dwMod << 1) + ((ALoVal & _Bit32_[byteBit]) != 0);
-
- if (dwMod >= ADivisor)
- {
- result++;
- dwMod -= ADivisor;
- }
- }
-
- // 判断是否需要余数
- if (ARemainder != NULL)
- *ARemainder = dwMod;
- }
-
- // 返回结果
- return result;
- }
|