嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 如何有效取余,非%不可吗?

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

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


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


接下来我们就以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次方,就可以使用这个小技巧。


你学废了吗 ?

END

往期推荐