如何在不使用C#内置数学函数的情况下计算基数为2的对数?

时间:2012-08-18 23:22:00

标签: c# .net logarithm

如何在不使用C#内置数学函数的情况下计算基数为2的对数?

我在一个应用程序中反复使用Math.Log和BigInteger.Log数百万次,它变得非常缓慢。

我对使用二进制操作实现相同功能的替代方案感兴趣。请记住,如果有助于加快执行时间,我可以使用日志近似值。

5 个答案:

答案 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)

bit hacks页面对于这样的事情非常有用。

C中有代码,但基本思想也适用于C#。

答案 4 :(得分:0)

如果您可以使用近似值进行到期,那么请使用英特尔芯片使用的技巧:将值预先计算为合适大小的数组,然后引用该数组。您可以使用任何最小/最大值来开始和结束数组,并且可以根据需要创建任意数量的中间值以实现所需的精度。