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

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

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

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

对于BigInteger,您可以使用toByteArray()方法,然后手动查找最重要的1并计算之后的零数。 这将为您提供具有整数精度的base-2对数。

假设你只对对数的组成部分感兴趣,你可以这样做:

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)

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

  • 使用查找表查找整数的日志库2

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

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