对没有整数除数(也不是乘数)的嵌入式平台进行编码,是否可以快速执行“除以24”?
乘以24只是
int a;
int b = (a << 4) + (a << 3); // a*16 + a*8
但分裂?这是一个非常简单的除数,只设置了两位?
答案 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
这一事实,因此您可以再次使用转移8
:a / 8 == a >> 3
。之后你必须将结果除以3
。可以找到关于如何有效地做到这一点的讨论here。当然,如果您使用c
(或任何其他更高级别的语言)进行编码,那么首先简单地查看compileroutput可能是值得的,编译器可能已经有了一些技巧。