如何在64位代码中实现高效的32位DivMod

 0523wei 发布于 2023-02-14 02:36
  • php
  • 1 个回答
    • 对于总是除以10(每条评论)的特殊情况,您可以执行以下操作:

      procedure DivMod10(num : Cardinal; var q, r : Cardinal); inline;
      var
        rl : uInt64;
      begin
        rl := UInt64(3435973837)*num;
        q := rl shr 35;
        r := num - q*10;
      end;
      

      算法因分母而异,但确定它的来源和幻数可以在libdivide中找到.这对于所有无符号32位整数都是准确的,并且比使用div(并提供余数)快约3倍.

      基准(优化):

        t0 := GetTickCount;
        for I := 1 to 999999999 do begin
          DivMod10(i, q, r);
        end;
        ShowMessage(IntToStr(GetTickCount - t0));  // result :  1809
      
        t0 := GetTickCount;
        for I := 1 to 999999999 do begin
          q := i div 10;
        end;
        ShowMessage(IntToStr(GetTickCount - t0));  // result :  5336
      

      测试:

      for I := 1 to High(Cardinal) do begin
        DivMod10(i,q,r);
        if q <> (i div 10) then WriteLn(IntToStr(i));
        // no mismatch found
      end;
      

      2023-02-14 03:16 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有