关于ulldiv的实现

pigsanddogs 2007-08-31 06:06:45
对于64位无符号除法, vc调用一个库函数_ulldiv来实现,
原代码在rtl/intel/ulldiv.asm有实现,简单描述成c语言就是这样的
假设a,b,c都是64位数, 那么要求c = a/b

a ' = a;
b ' = b;

if (b ' < 0x100000000)
{
return a '/b '; //因为如果b能用一个dword表示, 那么可以edx:eax div ecx实现
}

while(b >= 0x10000000) //否则, 就把b和a同时右移, 移动到b能放到一个dword结束
{
b ' > >= 2;
a ' > >= 2;
}
c = a '/b '; // 这个时候,再次可以用edx:eax div ecx来实现.
if (c*b > a) --c; // 如果c*b比a要大的话, 说明刚得到的c比实际的c要少一.
return c;


其实算法很巧妙, 而且人也非常容易理解.
我把2个数都缩小一点, 然后来除,
但问题是:
怎么证明这个都缩小以后算出来的c就比原来的c大1, 或者跟原来的c一样的大?


ps: 这个问题困惑了我1个月, 天天晚上就是想办法证明,
但总是做不出来. 现在睡觉都睡不好了. 帮我解决下, 另外我在送100分.
...全文
118 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigsanddogs 2007-09-04
  • 打赏
  • 举报
回复
up
pigsanddogs 2007-08-31
  • 打赏
  • 举报
回复
up

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧