【发布时间】: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
为没有整数除数(也没有乘数)的嵌入式平台编码,有没有一种快速的方法来执行“除以 24”?
乘以 24 很简单
int a;
int b = (a << 4) + (a << 3); // a*16 + a*8
但是除法?这是一个非常简单的除数,只设置了两个位?
【问题讨论】:
标签: bit-manipulation bitwise-operators bit
如果您不需要精确的结果,那么您可以考虑乘以 1/24:
uint16_t a = ...;
uint32_t b = (uint32_t)a * (65536L / 24);
uint16_t c = b / 65536;
当然,如果您的平台没有硬件乘法器,那么您将需要优化该乘法器。事实证明,(65536 / 24) 大约等于 2730,即二进制的 101010101010。这样乘法就可以通过 3 次移位和加法来实现。
【讨论】:
首先你可以使用24=8*3这个事实,所以你可以再次使用移位除以8:a / 8 == a >> 3。之后,您必须将结果除以3。关于如何有效地做到这一点的讨论可以在here 找到。当然,如果您使用c(或任何其他更高级别的语言)进行编码,那么首先简单地查看编译器输出可能是值得的,编译器可能已经为此提供了一些技巧。
【讨论】: