建议12:尽量减少使用除法运算与求模运算

对计算机来说,除法与求模是整数算术运算中最复杂的运算。相对其他运算(如加法与减法)来说,这两种算法的执行速度非常慢。例如,ARM硬件上不支持除法指令,编译器调用C库函数来实现除法运算。直接利用C库函数中的标准整数除法程序要花费20~100个周期,消耗较多资源。

在非嵌入式领域,因为CPU运算速度快、存储器容量大,所以执行除法运算和求模运算消耗的这些资源对计算机来说不算什么。但是在嵌入式领域,消耗大量资源带来的影响不言而喻。因此,从理论上讲,我们应该在程序表达式中尽量减少对除法运算与求模运算的使用,尽量使用其他方法来代替除法与求模运算。例如,对于下面的示例代码:


if (x/y>z)
{
    // ...
}

我们可以将其修改成如下形式:


if (((y>0)&&(x>y*z))||((y<0)&&(x<y*z)))
{
    // ...
}

这样就简单地避免了一些除法运算。同时,也可以在表达式中通过合并除法的方式来减少除法运算,下面通过示例来讲解。对于如下代码:


double x=a/b/c;
double y=a/b+c/b;

根据数学结合原则,上面的代码可以通过合并的方式减少代码中的除法运算,修改后的代码如下:


double x=a/(b*c);
double y=(a+c)/b;

同样,对于求模运算,也可以采用相应的方法来代替,如下面的示例代码:


a=a%8;
// 可以修改为:
a=a&7;

对于下面的表达式:


x=(x+y)%z;

可以通过如下方式来避免使用模操作符:


x+=y;
while(x>=z)
{
    x-=z;
}

通过上面的阐述,相信大家对如何减少使用除法与模运算有了初步了解。下面将详细讨论如何优化除法运算与求模运算。