使用乘法执行整数除法[重复]

2024-04-20

查看编译器生成的 x86 程序集,我注意到(无符号)整数除法有时会实现为整数乘法。这些优化似乎遵循以下形式

value / n => (value * ((0xFFFFFFFF / n) + 1)) / 0x100000000

例如,除以 9:

12345678 / 9 = (12345678 * 0x1C71C71D) / 0x100000000

除以 3 将使用乘法0x55555555 + 1, 等等。

利用这一事实mul指令将结果的高位部分存储在edx寄存器中,除法的最终结果可以使用与魔术值的单个乘法来获得。 (尽管这种优化有时与最后的按位移位结合使用。)

我想了解一下这实际上是如何运作的。这种方法什么时候有效?为什么我们的“神奇数字”必须加 1?


该方法称为“除以不变乘法”。

您看到的常数实际上是倒数的近似值。

因此,而不是计算:

N / D = Q

你可以这样做:

N * (1/D) = Q

where 1/D是可以预先计算的倒数。

从根本上说,倒数是不精确的,除非D是二的幂。因此会涉及一些舍入误差。这+1您看到的就是纠正舍入误差的。


最常见的例子是除以 3:

N / 3 = (N * 0xaaaaaaab) >> 33

Where 0xaaaaaaab = 2^33 / 3 + 1.

这种方法将推广到其他除数。

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

使用乘法执行整数除法[重复] 的相关文章

  • str.find 怎么这么快?

    我之前遇到过一个问题 我在迭代字符串并使用切片时寻找子字符串 原来这是一个really关于性能的坏主意 str find速度要快得多 但我不明白为什么 import random import string import timeit Ge
  • 按位移位(左移或右移)有什么作用以及它的用途是什么?

    我见过运营商 gt gt and lt lt 在我看过的各种代码中 我真正理解的都不是 但我只是想知道它们实际上做了什么以及它们的一些实际用途是什么 如果班次就像x 2 and x 2 与实际使用的真正区别是什么 and 运营商 有性能差异
  • 比较字符串结尾的最佳方法是使用 RIGHT、LIKE 还是其他?

    我需要将字符串的结尾与存储过程中可能的结尾列表进行比较 会被叫很多 大概有10 15个候选结局 此时 仅使用代码的解决方案比创建专用于此的表更好 类似的东西 IF ENDSWITH var foo OR ENDSWITH var bar O
  • 我可以让 C++ 编译器在编译时实例化对象吗?

    我正在编写一些代码 其中包含大量相当简单的对象 我希望它们在编译时创建 我认为编译器能够做到这一点 但我无法弄清楚如何做到 In C我可以执行以下操作 include
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • 查找二维空间中圆内的所有点

    我表示我的 2D 空间 考虑一个窗口 其中每个像素显示为 2D 数组中的一个单元格 即 100x100 的窗口由相同维度的数组表示 现在给定窗口中的一个点 如果我画一个半径的圆r 我想找到该圆圈中的所有点 我想我应该检查半径周围方形区域中的
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • scipy-optimize-minimize 不执行优化 - CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL

    我试图最小化定义如下的函数 utility decision decision risk cost 其中变量采用以下形式 决策 二进制数组 风险 浮点数数组 成本 常数 我知道解决方案将采取以下形式 决定 1如果 风险 gt 阈值 决定 0
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情

随机推荐

  • 使用 LLVM 为整个源代码生成 CFG

    LLVM 社区的任何人都知道是否有一种方法可以使用以下方法为整个输入源代码生成 CFG opt dot cfg foo ll bc 由于此函数为每个函数生成 CFG 因此函数之间的连接将被忽略 看来旧的分析工具已经贬值了 我想知道你是否找到
  • 使用 highcharts 在堆栈标签中显示特定系列值

    这是我正在处理的内容 http jsfiddle net josip0423 prJjY 171 http jsfiddle net josip0423 prJjY 171 过去几个小时我一直在努力解决这个问题 但一无所获 我对 javas
  • C# 异步操作

    实际上我很难理解 BeginInvoke 和 EndInvoke 对 class AsynchronousDemo public delegate void DemoDelegate static void Main DemoDelegat
  • glGenerateMipmap 是否在 sRGB 纹理的线性空间中执行平均?

    OpenGL 3 3 规范似乎没有要求 mipmap 生成在线性空间中完成 我能找到的只有以下内容 派生的 mipmap 数组的内部格式都与 levelbase 数组和派生数组的维度如下 第 3 8 14 节中描述的要求 的内容 派生数组是
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 在用 Kotlin 编写的 Android 库的公共 API 中处理 R8 + JvmStatic Annotation + Lambda

    首先请注意 我并不期待why do you want to obfuscate library评论 这是我要问的一个真正的问题 我在使用 Kotlin 编写的 Android 库处理 R8 混淆时遇到了问题 我有一个公共 API 方法 其注
  • 使用 C# 不使用 xslt 将 XML 转换为 CSV

    我一直在网上搜索 我假设有人必须在我之前需要这个并且做得更好 以获取 xml 到 csv 转换器 我有一个非常标准的 xml 如下
  • IE7 大纲:0 不工作

    我知道大纲是用于可访问性的 但还有另一种方法 a outline 0 可以在 IE7 中运行的东西 也许使用 Jquery 对于 jquery 你可以尝试这样的事情 a focus function this blur 它本质上与 IE 7
  • 决定要 #include 哪些标准头文件

    假设我正在编辑一些大型 C 源文件 并且我添加了几行碰巧使用的代码auto ptr 如下例所示 include
  • c中前缀和后缀的优先级和结合性

    int main char arr geeksforgeeks char ptr arr while ptr 0 ptr printf s s arr ptr getchar return 0 while循环内的语句 ptr 我不明白的行为
  • SSE,行主要与列主要性能问题

    出于个人和娱乐目的 我正在使用 SSE 4 1 编写一个 geom 库 我花了最后 12 个小时试图理解处理行主要与列主要存储矩阵时的性能问题 我知道 Dirext OpenGL 矩阵是以行主顺序存储的 因此对我来说 将矩阵按行主顺序存储会
  • Android Http 获取会话 Cookie

    我本来不想在这里发帖 因为网上有太多信息 但我已经深入搜寻但无法弄清楚 好吧 所以我无法让它在两种情况下工作 希望这两种情况的答案是相同的 我的问题是我设置了请求标头 但它似乎没有发送它 我有一个会话 id s e32ff223fwefd3
  • 从片段访问父活动的数据

    从活动的片段访问活动的数据成员的最佳方法是什么 我知道的一些方法包括 在 Activity 将实现的 Fragment 中创建一个接口 该接口将具有访问活动数据成员的方法 直接使用片段中的 Activity getActivity getX
  • jQuery:触发器不会在使用 .load() 加载的元素上触发

    我有index php 并使用jQuery load 从load php 加载内容 当我在 index php 中的元素上触发事件时 该事件将触发 在相同的元素上 当使用 load 加载到 index php 时 事件不会触发 为什么 我做
  • 设置 CRS 以使用雄蕊图进行绘图

    我试图在地图上绘制一个简单的多边形来表示我感兴趣的区域 迄今为止 我已将多边形定义为并且能够单独绘制它 poly lt st polygon list as matrix data frame lat c 40 40 60 60 40 lo
  • Jasmine 测试在 Chrome 和 Firefox 中通过,但在 PhantomJS 中失败

    我正在使用 React 构建一个基本的博客应用程序 我正在使用 Jasmine 和 Karma 来运行我的前端测试 我启动并运行了第一个测试 它在 Chrome Chromium 和 Firefox 中通过 但是当它在 PhantomJS
  • 如何将 添加到 TextBox c#?或者如何将动态字符串附加到 TextBox 中的静态字符串?

    在 WPF 中 我知道对于 TextBlock 当我想将一些 动态 字符串附加到字符串时 我可以执行如下操作
  • SBT、依赖项、类路径和编辑器

    我最近将 sbt 设置更新到版本 0 11 如您所知 新的 SBT 使用 ivy2 文件夹来存储 缓存所有检索到的 jar 文件 我正在使用 IntelliJ 我想知道将依赖项导入编辑器类路径的推荐方法是什么 一种选择是手动访问 ivy2
  • 呈现模式视图控制器后将 BarButtons 添加到 UINavigationBar

    我正在使用实用程序应用程序的模板 在 FlipSideViewController 中 我为 UINavigationController navController 添加了 IBOutlet 在代码中 我添加了 navController
  • 使用乘法执行整数除法[重复]

    这个问题在这里已经有答案了 查看编译器生成的 x86 程序集 我注意到 无符号 整数除法有时会实现为整数乘法 这些优化似乎遵循以下形式 value n gt value 0xFFFFFFFF n 1 0x100000000 例如 除以 9