• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

C++求余用的“%”有与它效率相同的其它算法吗?

C++求余用的“%”有与它效率相同的其它算法吗?

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与2

如果右侧为常数,可转换成乘法、右移和減法。现代的编译器都会做这个优化,例如

//mod.cunsigneda=123;intmain(){returna%13;}
使用 clang -c -S mod.c 输出汇编

movl$13,%eaxmovl$0,-4(%rbp)movl_a(%rip),%ecxmovl%eax,-8(%rbp)##4-byteSpillmovl%ecx,%eaxxorl%edx,%edxmovl-8(%rbp),%ecx##4-byteReloaddivl%ecxmovl%edx,%eax这是直接翻译,用 divl 做除数,这指令同时能获得余数(edx ),但 divl 是很慢的。

然而,使用优化的话 clang -c -S -O3 mod.c

movl_a(%rip),%eaximulq$1321528399,%rax,%rcx##imm=0x4EC4EC4Fshrq$34,%rcximull$13,%ecx,%ecxsubl%ecx,%eax
解释一下,因为 1321528399 / 2^34 ≈ 1 / 13

a%13=a-(a/13)*13=a-uint32_t((uint64_t(a)*1321528399ULL)>>34)*13

使用道具 举报

x mod y: while(x >= y) x -= y;
最终x就是要获得的结果,适用于x比y很大的时候。如果觉得行希望采纳,谢谢!

使用道具 举报

发新帖

发布任务需求已有1031167位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!