高效(逐位)除以24

时间:2011-12-07 17:28:39

标签: bit-manipulation bitwise-operators bit

对没有整数除数(也不是乘数)的嵌入式平台进行编码,是否可以快速执行“除以24”?

乘以24只是

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

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

2 个答案:

答案 0 :(得分:4)

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

uint16_t a = ...;

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

uint16_t c = b / 65536;

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

答案 1 :(得分:1)

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