【问题标题】:Efficient (bit-wise) division by 24高效(按位)除以 24
【发布时间】:2011-12-07 17:28:38
【问题描述】:

为没有整数除数(也没有乘数)的嵌入式平台编码,有没有一种快速的方法来执行“除以 24”?

乘以 24 很简单

int a;
int b = (a << 4) + (a << 3); // a*16 + a*8

但是除法?这是一个非常简单的除数,只设置了两个位?

【问题讨论】:

标签: bit-manipulation bitwise-operators bit


【解决方案1】:

如果您不需要精确的结果,那么您可以考虑乘以 1/24:

uint16_t a = ...;

uint32_t b = (uint32_t)a * (65536L / 24);

uint16_t c = b / 65536;

当然,如果您的平台没有硬件乘法器,那么您将需要优化该乘法器。事实证明,(65536 / 24) 大约等于 2730,即二进制的 101010101010。这样乘法就可以通过 3 次移位和加法来实现。

【讨论】:

  • 3 班次和加法.. 很抱歉成为这样的新手(试图超越 C18 编译器..) - 你如何在 3 班班次和加法中乘以 2730?我已经在 python 上测试了 ((a/8)*683)/2048 对我的目的来说已经足够好了,并且对于我感兴趣的 'a' 范围内不会溢出 16 位,现在只需将其推入位操作。
  • @qdot:从二进制表示中可以看出,2730 = 10 * 273 = (8 + 2) * (256 + 16 + 1) (实际上是四班三加)。
  • 是的。这正是我在“三班加班”中所缺少的。无论如何,我让编译器帮助我进行高效乘法,现在整个手动调整的 576 选择 switch 语句从 180us 下降到 21us。对于 6MIPS 内核来说还不错。
【解决方案2】:

首先你可以使用24=8*3这个事实,所以你可以再次使用移位除以8a / 8 == a &gt;&gt; 3。之后,您必须将结果除以3。关于如何有效地做到这一点的讨论可以在here 找到。当然,如果您使用c(或任何其他更高级别的语言)进行编码,那么首先简单地查看编译器输出可能是值得的,编译器可能已经为此提供了一些技巧。

【讨论】:

  • 是的,我正在用 C 编写代码。不,编译器只是为“除以 3”调用了一个辅助长除法函数,所以那里没有乐趣。 0xAAAB 技巧很棒,请参阅我上面的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多