如何在不使用C#内置数学函数的情况下计算基数为2的对数?
我在一个应用程序中反复使用Math.Log和BigInteger.Log数百万次,它变得非常缓慢。
我对使用二进制操作实现相同功能的替代方案感兴趣。请记住,如果有助于加快执行时间,我可以使用日志近似值。
答案 0 :(得分:4)
假设你只对对数的组成部分感兴趣,你可以这样做:
static int LogBase2(uint value)
{
int log = 31;
while (log >= 0)
{
uint mask = (1 << log);
if ((mask & value) != 0)
return (uint)log;
log--;
}
return -1;
}
(注意0的返回值是错误的;它应该是负无穷大,但是对于整数数据类型没有这样的值,所以我返回-1)
答案 1 :(得分:2)
答案 2 :(得分:1)
对于BigInteger,您可以使用toByteArray()方法,然后手动查找最重要的1并计算之后的零数。这将为您提供具有整数精度的base-2对数。
答案 3 :(得分:1)
答案 4 :(得分:0)
如果您可以使用近似值进行到期,那么请使用英特尔芯片使用的技巧:将值预先计算为合适大小的数组,然后引用该数组。您可以使用任何最小/最大值来开始和结束数组,并且可以根据需要创建任意数量的中间值以实现所需的精度。