如何有效取余,非%不可吗?

在编写程序过程中,通常会对对某些数据进行取余操作,这个时候我们通常都会用到%运算符,但是除了%就不能用其它方法吗?

答案是有的,而且执行效率也比使用%高,但是使用起来会有一些条件限制。

接下来我们就以6对4取余来分析,测试环境为Keil和STM32。

下图为使用%求余过程

由此可见,除了第一次将初值6赋值为r1寄存器,在对4求余的过程中,使用了MOV、ADD、SUB以及ASR共5次汇编指令。

下面也给出了每个汇编指令的表达式,最右侧有注释,有兴趣的可以看下

     4:   int a=6; 
0x08000F40 2106      MOVS     r1,#0x06         //r1=6;
     5:   return a%4; 
0x08000F42 460A      MOV      r2,r1            //r2=r1;
0x08000F44 17C8      ASRS     r0,r1,#31        //r0=r1>>31;
0x08000F46 EB017090  ADD      r0,r1,r0,LSR #30 //r0=r1+r0>>30;
0x08000F4A 1080      ASRS     r0,r0,#2         //r0=r0>>2;
0x08000F4C EBA10080  SUB      r0,r1,r0,LSL #2  //r0=r1-r0<<2;

接下来我们继续看另外一种方法,使用&代替%求余,如下图

对4求余可以转变为对3求与,除了第一次将初值赋给r1,在对3与只用到了一次AND指令即可。指令条目缩短,效率大大提升。

a%b,什么时候能将&代替%呢,首先a是正整数,b为2的n次方,就可以使用这个小技巧。

你学废了吗 ?


原文:喜欢文章的可以关注“typedef”公众号

如何有效取余,非%不可吗?如何有效取余,非%不可吗?https://mp.weixin.qq.com/s?__biz=Mzg3NzA4NjEyMg==&mid=2247484052&idx=1&sn=ead4a6c718e400a85167791c0950dc97&chksm=cf291651f85e9f47543b101130f6f42939c6b0973bc0bd0a27ad1cbd9c4b559a3cc0010b2c0c&token=1287654133&lang=zh_CN#rd

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值