- 已关闭**。此问题需要超过focused。当前不接受答案。
- 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
9小时前关门了。
Improve this question
用更具体的数字而不是2的幂来划分uint8的最有效方法是什么?不需要像普通除法那样精确,例如:正常比特移位除法选项-2、4、8、16、32、64、128、256概念1 - 2、4、6、8、10、12、14、16 ...概念2 - 2、3、4、6、8、12、16、24、32、48、64、96、128、192、256、384
这里的目标是使函数非常高效,并且与常规的位移位除法相比,除法步骤数至少为2倍。概念1和2在这里表明,除法值是否为指数无关紧要。如果需要,可以允许一些加法或减法。
1条答案
按热度按时间0pizxfdo1#
如果您感兴趣的是位移位除以预定义的数字,第一步是用二进制表示它的倒数,然后按相应的量进行位移位。例如,在8位算术中使用位移位除以42,如下所示:
正如您所看到的,精度受到所取有效位数的限制。2的幂有一个很好的特性,即在2进制和10进制中都有有限的逆。将“好看”的10进制数(如1/5)取反很容易在2进制中变成一场灾难。但是,如果“初始”2次幂除法等于使用这个列表进行移位和加法(每个移位1次,不需要加法,没有什么能比得上这里的性能):
你可以简单地扩展它,例如这个列表(2位移位和1次加法):
当然,最佳化的程度取决于所需的移位和加法的数量,所以在这种方法中选择
0b0.11111110
是一个相当糟糕的主意。0b0.101 = 0.625 = 1/1.6
及其右移位(0b0.0101
、0b0.00101
等)在base-10和base-2中都很好用,当然,在二进制表示中仍然只有两个1。