首页 / 知识
除了在C / C中使用%(模数)之外,还有其他选择吗?
2023-04-14 11:06:00

Is there any alternative to using % (modulus) in C/C++?我曾经在某处读到,模运算符在小型嵌入式设备(例如没有整数除法指令的8位微控制器)上效率低下。也许有人可以证实这一点,但我认为这种差异比使用整数除法运算要慢5到10倍。 除了保持计数器变量并在mod点手动溢出为0之外,还有其他方法吗?
vs: 我目前的操作方式:
啊,按位运算的乐趣。许多除法例程的副作用是模数-因此在少数情况下,除法运算实际上应快于模数。我很想知道您从中获得此信息的来源。带有乘法器的处理器使用乘法器具有有趣的除法例程,但是您只需再进行两步(乘和减)就可以将除法结果转换为模数,因此仍具有可比性。如果处理器具有内置的除法例程,您可能会看到它还提供了余数。 仍然,有一小部分数论致力于模块化算术,如果您真的想了解如何优化模数运算,则需要进行研究。例如,模块化算术对于生成魔术方块非常方便。 因此,就x的示例而言,这是一个非常低级的模数数学运算,它应向您显示与除法相比它有多简单: 考虑问题的更好方法可能是数字
以这种方式表示,您可以分别计算模7 计算8位数字的mod 7结果可以在
其中a,b和c是3位数字。
因为 当然,a,b和c是
我花了一些时间编写PIC版本。实际执行
这是测试算法的常规程序
最后,对于16位结果(我尚未测试),您可以
斯科特 如果您要计算一个数模的2的幂,可以使用按位和运算符。只需从第二个数字中减去一个即可。例如:
一些警告: 在大多数情况下,使用模数不是2的幂的开销。 在大多数情况下,这不是值得考虑的优化,当然也不值得计算您自己的快捷方式操作(特别是如果它仍然涉及除法或乘法)。 但是,经验法则是将数组大小等选择为2的幂。 因此,如果要计算星期几,则无论如何都可以使用%7 除非您确实确实需要在多个嵌入式平台上实现高性能,否则在您进行概要介绍之前,请勿出于性能原因而更改编码方式! 为优化性能而笨拙地编写的代码很难调试和维护。编写一个测试用例,然后将其配置在目标上。一旦知道模数的实际成本,然后确定替代解决方案是否值得编码。 @Matthew是正确的。试试这个:
n 您应该真正检查所需的嵌入式设备。我见过的所有汇编语言(x86,68000)都使用除法实现模数。 实际上,除法汇编操作将除法结果和余数返回到两个不同的寄存器中。 您可以访问嵌入式设备上的任何可编程硬件吗?喜欢柜台等吗?如果是这样,您也许可以编写基于硬件的mod单元,而不用使用模拟的%。 (我曾在VHDL中这样做一次。不确定是否仍然有代码。) 请记住,您确实说过分裂快了5到10倍。您是否考虑过进行除法,乘法和减法来模拟mod? (编辑:误解了原始帖子。我确实认为除法比mod快是奇怪的,它们是相同的操作。) 但是,在您的特定情况下,您正在检查的mod是6。6 = 2 * 3。因此,如果您首先检查最低有效位是否为0,则可能会获得一些小的收益。
不过,如果您这样做,我建议您确认自己有任何收获,对分析人员来说是这样。并做一些评论。我为下一个不得不看代码的家伙感到难过。 在嵌入式世界中,您需要执行的"模数"运算通常可以很好地分解为可以用 n @Jeff V:我发现有问题! (除了您的原始代码正在寻找mod 6,现在您实质上正在寻找mod 8)。您继续做额外的1!希望您的编译器对此进行了优化,但是为什么不只是从2开始测试并转到MAXCOUNT(含)?最后,每次(x 1)不被8整除时,您将返回true。这是您想要的吗? (我想是的,但只是想确认。) 这不一定更好,但是您可以有一个内部循环,该循环始终上升到 那是说,我建议在您打算使用的平台上进行一些研究和性能分析,以明确了解您所面临的性能约束。可能还有更多生产力的地方可以投入优化工作。 与最慢的模数运算符实现相比,打印语句所花费的时间要长几个数量级。因此基本上,注释"在某些系统上缓慢"应该是"在所有系统上缓慢"。 此外,提供的两个代码段执行的操作不同。在第二行中, 行
始终为假,因此" FIZZ \\\\ |
最新内容
相关内容
linux常见命令指令符?
linux常见命令指令符?,工作,系统,地址,信息,命令,目录,管理,标准,时间,功能,linux常用的命令有哪些1、linux系统常用操作命令如下:ls:全拼list,功linux指令中的命令?
linux指令中的命令?,系统,基础,工作,地址,命令,工具,管理,信息,网络,控制台,Linux系统基础操作指令linux常用命令有pwd命令、cd命令、ls命令、linux命令行指令大全?
linux命令行指令大全?,工作,地址,系统,信息,命令,目录,工具,管理,基础,控制台,linux系统常用操作命令1、linux常用命令有pwd命令、cd命令、lslinux嵌入式截图命令?
linux嵌入式截图命令?,系统,环境,软件,网络,支柱,代码,工具,标准,发展,工作,linux本地打开index.html并截图1、在linux环境中我们也是可以系统嵌入式的linux命令?
嵌入式的linux命令?,系统,工作,地址,软件,信息,基础,命令,嵌入式,电脑,环境,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你是用linux退出指令命令?
linux退出指令命令?,档案,状态,时间,命令,系统,编辑,文件,模式,指令,内容,linux保存退出命令1、linux保存退出命令的方法如下:wq命令。不管内容linux命令下ll指令?
linux命令下ll指令?,系统,信息,时间,标准,命令,位置,状态,单位,文件,别名,linux里的文件,如何设置为只读权限文件1、可以使用chmodfilename改嵌入式linux解压命令?
嵌入式linux解压命令?,系统,环境,工具,产品,网络,嵌入式,软件,基础知识,电脑,流程,如何使用eclipse进行嵌入式Linux的开发1、一般嵌入式板子都linux服务器命令指令?
linux服务器命令指令?,系统,信息,工作,情况,标准,设备,对比,命令,状态,平均,16个不可不知的Linux服务器监控命令uptime 该命令直观的显示了服linux查看指令命令?
linux查看指令命令?,工作,地址,系统,网络,信息,命令,标准,中心,管理,名称,linux常用命令linux常用命令:查看内核版本:uname-a。图形界面:init5或linux常用命令行指令?
linux常用命令行指令?,工作,地址,系统,信息,管理,命令,目录,标准,控制台,文件,Linux命令有哪些?Linux常用命令大全1、linux系统常用操作命令如linux数据库选择命令?
linux数据库选择命令?,系统,地址,工作,软件,管理,信息,工具,基础,命令,服务,操作系统常用命令和linux常用命令怎么学首先打开linux操作系统在