模运算符是否会减慢嵌入式系统的速度很大程度上取决于which您正在讨论的嵌入式系统。
例如,MPS430 CPU 实际上并不have本机除法指令,因此,如果您使用该指令,则需要恢复为基于软件的计算。
然而,CPUdo有原生鸿沟通常是没问题的,所以最好先test在尝试解决问题之前,您是否遇到问题。
如果没有本机除法指令,您的第一次尝试将类似于 (C,仅适用于无符号并忽略其中的问题div
目前为零):
unsigned modulo (unsigned num, unsigned div) {
while (num >= div)
num -= div;
return num;
}
换句话说,使用重复的减法,如果num
很大并且div
是小。
然而,如果您意识到这一点,您就可以大大提高该函数的速度a % b
完全一样a % 2b
,前提是2b <= a
.
或者说它与a % 4b
,前提是4b <= a
。同上a % 8b
,前提是8b <= a
.
所以,通过一点递归魔法,我们可以调整num
所以它减少得非常快,以至于重复减法won't成为一个主要问题。
unsigned modulo (unsigned num, unsigned div) {
if (num - div >= div)
num = modulo (num, div + div);
while (num >= div)
num -= div;
return num;
}
而天真的代码示例在我的系统上大约需要十秒钟来处理一百个模运算(使用随机数进行num
和一个 1 到 100 之间的随机数div
),改进后的解决方案可以在大约三分之一秒内完成一百万次,加速了大约30万倍。
如果您知道除数是二的幂,您还可以大大加快速度 - 使用按位运算有一种更快的方法。考虑一下您想要锻炼:
974 % 16
您还可以使用二进制数和按位运算的属性来获得低四位:
num = num & 15;
那是因为15
is 1111
以二进制形式表示,如果你and
任何数字,它都会简单地清除顶部位,给你相同的结果mod 16
。这适用于两个的所有幂,例如2
, 4
, 8
, ... 65536
, ..., 等等。
对于具体的例子974 % 16
,二进制为974
按位与15
, gives:
1111001110
1111 &
----------
0000001110 (14)
and 14
is indeed正确答案。