高效的C编程之:除法运算
14.2.3求余运算
为了避免在程序中使用除法运算,可以将一些典型的求余运算进行转换。下面的例子提供一种转换方法。
uintcounter1(uintcount)
{return(++count%60);
}
转换成,
uintcounter2(uintcount)
{if(++count>=60)
count=0;
return(count);
}
下面是两个功能函数编译后的汇编代码。
counter1
STMDBsp!,{lr}
ADDa2,a1,#1
MOVa1,#3c
BL__rt_udiv
MOVa1,a2
LDMIAsp!,{pc}
counter2
ADDa1,a1,#1
CMPa1,#3c
MOVCSa1,#0
MOVpc,lr
上面的例子清晰的显示了使用if语句代替除法运算后,代码的执行效率有很大提高。
14.2.4除数是常数的除法
因为除法和模运算执行起来比较慢,所以应该尽可能地避免使用。但是除数是常数的除法运算和用同一个除数的重复除法,执行效率会比较高。在ARM的除法库中,存在除数为10的除法运算库,其中包括有符号除法和无符号除法。如果除数是10以外的其他常数,用户可以编写自己的功能函数。ARM的开发工具集中,提供了关于除数是常数的示例程序和算法分析,以供用户编写自己的代码时参考。
评论