高效的模 3 运算? [复制]

2023-12-14

可能的重复:
快速模 3 或除法算法?

每个人都知道模运算可能会对性能产生巨大的影响。有谁知道 x%3 操作的一个好的替代方案吗?我知道存在一个用于 x%2 的缓冲区,但我确实需要一个用于模 3 的缓冲区,因为我想在 for 循环中交替使用三个缓冲区。

Thanks!


好吧,而不是通常的“测量它”,而是一个实际的答案 - 因为那东西实际上是真正有趣的数学。尽管编译器也可以而且可能会这样做(至少现代优化 c++ 编译器,javac 当然不会,而且我不知道 JVM 是否会这样做) - 所以最好检查一下它是否还没有为你。

但了解优化背后的理论仍然很有趣:我将使用汇编,因为我们需要乘法的较高 32 位字。以下内容摘自沃伦关于位摆弄的书:

n 是我们想要取模的输入整数:

li M, 0x55555556   ; load magical number (2^32 + 2) / 3
mulhs q, M, n      ; q = higher word of M * n; i.e. q = floor(M*n / 2^32)
shri t, n, 31      ; add 1 to q if it is negative
add q, q, t

这里 q 包含 n / 3 的除数,所以我们照常计算余数:r = n - q*3

数学是有趣的部分 - 乳胶在这里会很酷:

q = 楼层( (2^32+2)/ 3 * (n / 2^32) ) = 楼层( n/3 + 2*n/(3*2^32) )

现在,对于 n = 2^31-1(有符号 32 位整数可能的最大 n),误差项小于 1/3(并且非负),这使得很容易证明结果确实是正确的。对于 n = -2^31,我们在上面进行了 1 的修正,如果您简化它,您会发现误差项始终大于 -1/3,这意味着它也适用于负数。

我将证明与错误项界限留给感兴趣的人 - 这并不难。

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

高效的模 3 运算? [复制] 的相关文章

  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 指定的包类型(主题、应用程序等)不允许使用“socket”

    用于套接字的 Chrome API 现在对我来说不起作用 我有以下清单 name My name version 0 1 manifest version 2 background page background html browser
  • Flutter 中的自动滚动

    所以我有一个 SingleChildScrollView 它的子级是 Column 里面有不同的小部件 我的应用栏上有 3 个按钮 每个代表 3 个我想跳转到的小部件 当我按下按钮时 我希望 UI 自动滚动到映射的小部件 就像我们在网站中看
  • 使用带有curl的bash脚本通过FTP检索目录中最后修改的文件

    我正在编写一个 bash 脚本 需要执行的任务之一是通过curl 连接到 FTP 服务器并查找最后修改的 zip 文件的名称 我们正在查看的文件的名称格式是MM DD YYYY ALL zip 到目前为止 我已经 有遗漏 lt lt gt
  • 创建电子邮件模板时出现问题

    我正在尝试创建一个如下所示的电子邮件模板 我用过表 除了图像未显示在正确的位置之外 我可以做所有事情 图像应该显示在容器的中间和顶部 参见屏幕 1 但我无法完成它 我试图提供negative margin to container 但 gm
  • jquery多属性选择器问题

    我有一个小问题 为什么这个简单的代码不起作用 html
  • 您必须启用 openssl 扩展才能通过 https 下载文件

    我想安装 Zend Framework 2 所以我下载了框架应用程序 正如ZF2手册中提到的 我们必须发出命令 php composer phar install 骨骼内部 但我收到错误 您必须启用 openssl 扩展才能通过 https
  • Facebook PHP-SDK 与 CodeIgniter 不返回 $_REQUEST['signed_request']

    class Example extends CI Controller function construct parent construct function index this gt load gt library facebookl
  • 检索在 TFS 中创建的已保存查询的 WIQL

    我使用 Web 界面在 TFS 中交互式地创建了一个查询 现在我想获取它正在使用的 WIQL 我知道的唯一方法就是打电话RESTful API 并传递 expand wiql 有更容易的方法吗 最好是通过交互式网络界面 您可以使用 Chro
  • 如何在 C# 中将值从 form2 datagridview 复制/传输到 form1 datagridview..?

    任何人都可以帮忙吗 我真的需要这方面的帮助 这里我有两个表格 form1 和 form2 我在每个表单中创建了 datagridview DGV 现在我需要通过单击 form2 上的一个按钮将值从 form2 datagridview 传输
  • Google-Play-Services:创建自定义等候室 UI

    我即将使用 google play games 为我的 Android 应用程序实现一个实时多人游戏 服务和收听房间更新遇到一些问题 我没那么有经验 所以请原谅可能出现的理解问题 我的意图是 如果有人最近加入了我的活动 我需要得到通知 创建
  • 从 Excel 中使用的 SQL 查询返回 Excel 表达式

    我有一个 Excel 电子表格 其数据是使用查询从 SQL Server 数据库加载的 查询很复杂 但这是一个简化 SELECT Collections id AS collectionId SOME EXCEL FUNCTION A CA
  • 根据java中降序的差异,过滤映射到每十的倍数一行

    我有一种方法可以按十的倍数过滤行 即我可以按升序过滤最接近十的倍数的行 例如 10 20 30 等 现在我想按降序执行相同的过程 请参考以下链接 根据差异将数组过滤为每十的倍数一行 在上面提到的链接中 相同的过程是按升序完成的 我想按降序执
  • AWS S3 虚拟主机 SSL 不提供索引页

    我无法解决 AWS S3 虚拟托管的问题 我需要在导航到主机名时提供 SSL 和索引页面 通过纯文本提供索引页面 http hjr test s3 website us east 1 amazonaws com 无法通过 SSL 访问 ht
  • 在 C++11 中哪里可以使用alignas()?

    为了标准化我的代码并使其更加可移植 我替换了 ifdef GNUC typedef attribute aligned 16 float aligned block 4 else typedef declspec align 16 floa
  • “编译 PDF”和 knit2pdf 之间的区别

    我有一个 Rnw 文件 可以使用 RStudio 中的 编译 PDF 按钮 或 Command Shift k 将其编译为 PDF 但是 当我使用 knit2pdf 时 不会创建图形 也不会创建完整的 PDF 为什么会出现这种情况呢 如何具
  • 登录脚本未按要求工作

    我是 php 新手 尝试开发登录脚本 但是当我输入值时它不起作用 我什至找不到错误 因为当我单击 提交 时 它只会刷新页面 这是我的代码
  • EJB - 性能问题(更多数量的 EJB 对性能有影响)

    我们正在开发一个包含大约 400 个数据库表的应用程序 并具有相同数量的 EJB 全部都是本地接口 EJB 是无状态的 并且一个 EJB 通过 EJB 标记注入到另一个 EJB 中 我的疑问是 拥有更多数量的 EJB 是否会对应用程序的性能
  • Spring 中的内容类型问题

    我收到的帖子有问题 我有以下端点 RequestMapping value payment method POST public void saveOrder RequestBody PaymentDto paymentDto throws
  • 如何以编程方式找出哪个用户拥有哪个进程?

    好的 所以我想做的是找出给定进程所属的用户名 Process processList Process GetProcesses foreach Process p in processList Console WriteLine p Id
  • 高效的模 3 运算? [复制]

    这个问题在这里已经有答案了 可能的重复 快速模 3 或除法算法 每个人都知道模运算可能会对性能产生巨大的影响 有谁知道 x 3 操作的一个好的替代方案吗 我知道存在一个用于 x 2 的缓冲区 但我确实需要一个用于模 3 的缓冲区 因为我想在