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

2024-01-14

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


模运算符是否会减慢嵌入式系统的速度很大程度上取决于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正确答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 三星 G5 setvisibility 出现空指针异常

    Android 应用代码可在各种设备上成功运行 包括早至 API 14 至 API 19 目标 但是 Samsung G5 v4 4 4 在尝试为活动设置 Visibilty true 时会抛出 NPE 此错误可能仅在最近通过 Sprint
  • 编组通知包

    我正在尝试将通知对象写入文件 我能找到的最好方法是将对象写入包 编组该包以获取字节 然后将其写入文件 Parcel notif Parcel obtain notification writeToParcel notif 0 byte no
  • 当 Go 返回多个值时到底发生了什么

    Go 函数和方法可以返回多个值 func learnMultiple x y int sum prod int return x y x y return two values 总和 产品 learnMultiple 10 50 是不是和返
  • 是否可以更改 Java ME 中的垃圾收集行为?

    我想知道是否可以调整垃圾收集器在 JavaMe 上的工作方式 以某种方式提高性能 可能会减少段落数量 我看过一些关于它的文章 但大多是针对 Java SE 的 其中大多数都说 GC 高度依赖于制造商 那会是多少呢 垃圾收集器何时被触发在很大
  • 如何在Featuretools中实现加权和变换基元?

    我试图弄清楚如何为Featuretools 实现加权总和原语 权重应取决于 time since last 就像 cum sum 金额 sum i exp a i amount i where i正在滚动 6 个月期 在上面你可以找到原来的
  • 当弹出窗口处于活动状态时,如何与 ionic 中的后台项目进行交互?

    离子版本 1 x 平台 全部 我有一个使用离子弹出框的离子应用程序 但是 当弹出窗口处于活动状态 打开 时 我无法再与后台中的事物交互 例如向下滚动我的项目列表 我曾尝试寻找此问题的现有答案 但没有看到提出的问题 弹出窗口本身不必绑定到页面
  • AngularJs 如何从轮询服务获取数据到控制器

    我有这个service它检查后端是否有新数据 它工作正常 但问题是我无法使用从服务到控制器的数据 watch也不使用promise SERVICE service notificationPollService function q htt
  • Create-react-app 控制台显示块文件

    I would like to debug some errors happening during my React development As you can see I can t see the source files I am
  • Exoplayer 从字节数组播放音频 - ByteArrayDataSource

    使用 Exoplayer 我尝试播放字节数组中的音频文件 我正在尝试使用 ByteArrayDataSource 但在调用构造函数时出现错误 new ByteArrayDataSource data 这是我想出的代码 private voi
  • 角度表达式在 Chrome 扩展中计算,但在 Edge 扩展中不计算

    我有一个简单的浏览器扩展 使用 Angular v1 6 3 但是浏览器扩展的弹出窗口中的 Angular 表达式无法在 Edge 中计算 但在 Chrome 中却可以 Angular 的表达式很简单 div 2 2 div 当我浏览到相关
  • 排序在 jQuery 数据表中不起作用

    我在一页中有两个内联表 排序适用于一个数据表 但不适用于其他数据表 一次调用两个 div 但排序仅适用于一个数据表 div1 DataTable processing true destroy true paginate true leng
  • 使用 jQuery 和 asp.net 转发器自动完成填充 ID

    我有一个带有自动完成功能的 asp Textbox 数据来自网络服务并返回 Json 数据 当选择一个项目时 它会将一个值 id 放入 隐藏 字段中 并将价格放入另一个文本框中 这一切都很好 但是当我将或多或少相同的代码放入 asp rep
  • 需要在 Python Pandas 中过滤几列并更改其中一列的值

    我有一个包含 150 000 行和 15 列的表 此示例的重要列是 COUNTRY COSTCENTER 和 EXTENSION 我正在将 CSV 读入 Pandas Dataframe 所有列都是对象类型 我想做的是 搜索某个国家 地区
  • Maven 的综合站点/部署目标

    在 CI 服务器上运行 Maven 构建时 我生成站点来发布文档和报告 并将工件部署到快照存储库以供其他项目使用 为此 我设定了以下目标 mvn clean site deploy 这意味着单元测试已运行twice 一次用于站点生命周期 一
  • 将 JsonSerializerSettings 从 JsonSerializer 复制到新的 JsonSerializer

    有什么办法可以去掉设置JsonSerializer类并在新的中重新实现它们JsonSerializer 似乎没有任何方法可以做类似的事情 我发现最好的是通过反射调用的私有方法 ApplySerializerSettings 我正在尝试从Wr
  • Spring 表达式 (SpEL) - 舍入

    使用 SpEL 评估数学运算时是否有办法指定舍入精度 例如 ExpressionParser parser new SpelExpressionParser Expression exp parser parseExpression 2 3
  • Underscore.js - 获取唯一的属性值

    我最近才发现 underscore js 的强大功能 对方法仍然很陌生 我恳请建议 我如何从中得到 name Type 2 id 14 name Type 1 id 13 name Type 3 id 15 name Type 2 id 1
  • 有没有办法在 Javascript 中拥有/锁定 Enum 对象的唯一索引值? [复制]

    这个问题在这里已经有答案了 正在阅读 推荐方式 https stackoverflow com questions 287903 enums in javascript处理的枚举类型 https en wikipedia org wiki
  • Xcode 5.0.1 iOS 7.0.3 模拟器未启动

    我刚刚在 OSX Mavericks 上升级到 Xcode 5 0 1 并将 Xcode 升级到 5 0 1 当我尝试在 iOS 7 0 3 模拟器上启动应用程序时 模拟器无法启动 该应用程序将在 iOS 6 1 模拟器上启动 但 iOS
  • 嵌入式 C 中模运算符的替代方案? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 嵌入式 c 中是否有 运算符的替代方案 还有其他一些方法可以做到这一点 例如在 C 中使用 while 循环 但模运算符真的会降低微控