嵌入式c中是否有%运算符的替代?还有一些其他的方法,比如在c ++中使用while循环。模数运算符是否会降低微控制器系统的速度?
答案 0 :(得分:3)
模运算符是否会降低嵌入式系统的速度取决于您正在讨论的嵌入式系统。
例如,MPS430 CPU实际上没有原生除法指令,因此,如果您正在使用它,则需要恢复为基于软件的计算。
但是,做的CPU具有本机鸿沟通常是可以的,所以最好先尝试测试是否在尝试解决之前遇到问题。< / p>
如果没有本地划分指令,您的第一次尝试将类似于(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
,使其快速减少到重复减法不会成为主要问题的程度。
unsigned modulo (unsigned num, unsigned div) {
if (num - div >= div)
num = modulo (num, div + div);
while (num >= div)
num -= div;
return num;
}
虽然天真的代码示例在我的系统上花费大约十秒来处理一百个模运算(使用num
的随机数和div
的一个到一百的随机数,改进的解决方案可以在大约三分之一秒内达到一百万,加速大约300,000次。
如果你知道你的除数是2的幂,你也可以大大提高速度 - 使用按位运算的速度要快得多。考虑一下你想要解决:
974 % 16
您还可以使用二进制数和按位运算的属性来提供低四位:
num = num & 15;
那是因为15
是1111
二进制文件,如果你and
任何数字,它只会清除顶部位,给你与{{1}相同的结果}。这适用于两个人的所有权力,例如mod 16
,2
,4
,...... 8
,......等等。
对于65536
的具体示例,使用974 % 16
按位974
的二进制文件给出:
15
和1111001110
1111 &
----------
0000001110 (14)
确实是正确答案。
答案 1 :(得分:1)
可以用模数除,并从原数中减去结果。这并不比原始模数方法快。
Modulo包含在某些嵌入式处理器上速度较慢的分区。
有些例外可以更快地执行。可以通过简单的AND操作获得2,4,8,16等模数,这种操作非常快。