How can I compute a base 2 logarithm without using the built-in math functions in C#?

江枫思渺然 提交于 2019-12-14 04:17:54

问题


How can I compute a base 2 logarithm without using the built-in math functions in C#?

I use Math.Log and BigInteger.Log repeatedly in an application millions of times and it becomes painfully slow.

I am interested in alternatives that use binary manipulation to achieve the same. Please bear in mind that I can make do with Log approximations in case that helps speed up execution times.


回答1:


For the BigInteger you could use the toByteArray() method and then manually find the most significant 1 and count the number of zeroes afterward. This would give you the base-2 logarithm with integer precision.




回答2:


Assuming you're only interested in the integral part of the logarithm, you can do something like that:

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;
}

(note that the return value for 0 is wrong; it should be negative infinity, but there is no such value for integral datatypes so I return -1 instead)




回答3:


http://graphics.stanford.edu/~seander/bithacks.html




回答4:


The bit hacks page is useful for things like this.

  • Find the log base 2 of an integer with a lookup table

The code there is in C, but the basic idea will work in C# too.




回答5:


If you can make due with approximations then use a trick that Intel chips use: precalculate the values into an array of suitable size and then reference that array. You can make the array start and end with any min/max values, and you can create as many in-between values as you need to achieve the desired accuracy.



来源:https://stackoverflow.com/questions/12023007/how-can-i-compute-a-base-2-logarithm-without-using-the-built-in-math-functions-i

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!