查看: 3386|回复: 8

关于昨天群里讨论的除法

[复制链接]
  • TA的每日心情
    郁闷
    2025-2-20 09:41
  • 签到天数: 1704 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-2-21 13:36:34 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 nemon 于 2013-2-22 12:53 编辑

    今天看到昨天qq群里有人提问说:
    两个64位的无符号类型做除法,编译器老是报错
    定义了一个64位的无符号类型,typedef unsigned long long uint_64;
    uint_64 tps = 从其它变量复制过来的一个32位数;
    uint_64 tmp = 从其它变量复制过来的一个64位数;
    uint_64 tmp2 = tmp / tps;

    他要找除法的算法,@张叁给找了个汇编的,可是好像还不够用。
    鄙人抛块砖吧:
    1. __int64 my_div(__int64 *i1,__int64 *i2){//这里所有数字都是64位的
    2.         __int64 i_i,i_r;
    3.         i_r=0;
    4.         for(i_i=64-1;i_i>=0;i_i--)//从最高的63位开始一直到最低的0位
    5.         {
    6.                 i_r<<=1;
    7.                 if((*i1)>=((*i2)<<i_i))//本级如果够除
    8.                 {
    9.                         i_r+=1;
    10.                         (*i1)-=((*i2)<<i_i);
    11.                 }
    12.         }
    13.         return i_r;//返回除的结果,如果需要,这时候的(*i1)是余数
    14. }
    复制代码
    思想和汇编的一样,性能差点。
    又想到实际上不用把64位都过一遍,于是:
    1. typedef unsigned __int64 my_int;
    2. unsigned char my_div(my_int *i1,my_int *i2){//这里所有数字8、16、32、64位的就都可以了
    3.         my_int i_r;
    4.         char i_i=0;
    5.         if(*i2)
    6.         {
    7.                 while((*i1)>((*i2)<<i_i) )i_i++;
    8.                 for(i_r=0,i_i--;i_i>=0;i_i--)//从可能的最高位开始一直到最低的0位
    9.                 {
    10.                         i_r<<=1;
    11.                         if((*i1)>=((*i2)<<i_i))//本级如果够除
    12.                         {
    13.                                 i_r+=1;
    14.                                 (*i1)-=((*i2)<<i_i);
    15.                         }
    16.                 }
    17.                 (*i2)=i_r;
    18.                 return 0;//返回:这时候(*i1)是余数,(*i2)是除的结果
    19.         }
    20.         else
    21.         {
    22.                 return 1;//出错了
    23.         }        
    24. }
    复制代码
    大家拿玉来砸吧……克拉大钻更好

    点评

    多谢楼主分享,代码测试成功了没?  发表于 2013-2-21 14:07
    回复

    举报

  • TA的每日心情
    开心
    2019-4-2 16:02
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-2-21 14:13:34 | 显示全部楼层
    把抱的错贴上来啊,这样才好给你分析
    回复 支持 反对

    举报

  • TA的每日心情
    郁闷
    2025-2-20 09:41
  • 签到天数: 1704 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-2-21 14:21:42 | 显示全部楼层
    xiaopaohu123 发表于 2013-2-21 14:13
    把抱的错贴上来啊,这样才好给你分析

    上面的代码经过测试了,不过我一直联系不到昨天提问题的人,所以还不知能否解决他的困难。
    回复 支持 反对

    举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-2-21 15:25:27 | 显示全部楼层
    楼主强悍 厉害啊
    回复 支持 反对

    举报

  • TA的每日心情
    开心
    2019-4-2 16:02
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-2-21 16:32:47 | 显示全部楼层
    nemon 发表于 2013-2-21 14:21
    上面的代码经过测试了,不过我一直联系不到昨天提问题的人,所以还不知能否解决他的困难。 ...

    我还以为是你要问问题的,呵呵
    回复 支持 反对

    举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-3-1 00:07:14 | 显示全部楼层
    nemon 发表于 2013-2-21 14:21
    上面的代码经过测试了,不过我一直联系不到昨天提问题的人,所以还不知能否解决他的困难。 ...

    谢谢啦。
    我是在移植一款操作系统的时候碰到遇到的这个问题,原有的代码也没有这块内容,我在添加系统功能的时候需要做一下。可能原作者也发现这样用不合适,所以就没加,后来我跳过了64位除法的问题,用其它方法完成任务了。
    LZ的专研精神,我很敬佩。
    回复 支持 反对

    举报

  • TA的每日心情

    2013-10-17 16:10
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2013-3-19 22:43:12 | 显示全部楼层
    学习学习
    回复 支持 反对

    举报

  • TA的每日心情
    奋斗
    2013-8-20 13:01
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-4-7 09:27:26 | 显示全部楼层
    请问哪个qq群
    回复 支持 反对

    举报

  • TA的每日心情
    郁闷
    2025-2-20 09:41
  • 签到天数: 1704 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2013-4-7 17:19:08 | 显示全部楼层
    lzw20012001 发表于 2013-4-7 09:27
    请问哪个qq群

    135513647










    回复 支持 反对

    举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 3/3 下一条

    【预约参会三重礼】2025 瑞萨电子工业以太网技术日
    2025瑞萨电子工业以太网技术日聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案,通过案例剖析、现场演示、动手实践,全方位解读瑞萨电子最新实时通信技术解决方案,洞察行业发展趋势,助力企业高效开发更具竞争力工业以太网产品。

    查看 »

    手机版|小黑屋|与非网

    GMT+8, 2025-3-9 13:12 , Processed in 0.169597 second(s), 31 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.