嵌入式C中模运算符的替代方案? [关闭]

Posted

技术标签:

【中文标题】嵌入式C中模运算符的替代方案? [关闭]【英文标题】:Alternative of modulo operator in embedded C? [closed] 【发布时间】:2014-06-14 11:32:20 【问题描述】:

嵌入式 c 中是否有 % 运算符的替代方案?还有其他一些方法可以做到这一点,例如在 c++ 中使用 while 循环。但是模运算符会减慢微控制器系统的速度是真的吗?

【问题讨论】:

这似乎是一个重复的问题,***.com/questions/48053/… 你想用模运算符做什么? 模函数的计算有两种方法: - Barrett Reduction - Montgomery Reduction enter image description here 【参考方案1】:

模运算符是否会减慢嵌入式系统的速度在很大程度上取决于您正在讨论的哪些嵌入式系统。

例如,MPS430 CPU 实际上本机除法指令,因此,如果您使用它,则需要恢复为基于软件的计算。

但是,确实具有本机划分的 CPU 通常没问题,因此最好先测试您是否有问题,然后再尝试解决它。​​


如果没有本机除法指令,您的第一次尝试将类似于(C,仅用于无符号并忽略 div 目前为零的问题):

unsigned modulo (unsigned num, unsigned div) 
    while (num >= div)
        num -= div;
    return num;

换句话说,使用重复减法,如果num 很大而div 很小,则不会很快。

但是,如果您意识到a % ba % 2b 完全相同,那么您可以大大提高该函数的速度,前提是2b <= a

或者说和a % 4b一样,前提是4b <= aa % 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 有任何数字,它只会清除最高位,得到与mod 16 相同的结果。这适用于 2 的所有幂,例如 248、...65536、...等等。

对于 974 % 16 的具体示例,97415 的二进制位与运算得到:

1111001110
      1111 &
----------
0000001110 (14)

14确实是正确答案。

【讨论】:

【参考方案2】:

可以除以模数并从原始数中减去结果。这并不比原来的模法快。

模包含在某些嵌入式处理器上可能会很慢的除法。

有些例外情况可以更快地执行。 2、4、8、16等的模数可以通过简单的AND运算得到,速度非常快。

【讨论】:

以上是关于嵌入式C中模运算符的替代方案? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么是嵌入式系统的好 C 内存分配器? [关闭]

用于嵌入式项目的 C/C++ HTTP 客户端库 [关闭]

从嵌入式 SQL 迁移到 ODBC 的工具 [关闭]

嵌入式linux C语言——位运算的使用

嵌入式linux C语言——位运算的使用

极简嵌入式C语言教程——从入门到入土