2017-03-16 107 views
0

想知道是否有API直接计算log_2?这是我目前的代码,我将log_2(N)转换为log_e(N)/log_e(2)Java中BigInteger的log2

顺便说一句,它似乎对于普通的Java Double类型,没有方法直接计算log_2(double_value)

我用Java代码

BigInteger x = BigInteger.valueOf(16); 
BigInteger y = BigInteger.valueOf((long)(Math.log(x.longValue())/Math.log(2))); 
System.out.println(y.doubleValue()); // return 4.0 as expected 
+1

“'Math.log(x.longValue())'”注意'log'需要一个double,所以你可以在这里使用'x.doubleValue()',因为它无论如何将会扩大。 –

+0

@AndyTurner,同意和很好的捕获。顺便说一句,你知道是否有API直接计算log_2吗? –

回答

3

这是内置在BigInteger API。根据JavaDoc:

public int bitLength() 

返回此BigInteger的最小二进制补码表示的位数,不包括符号位。对于正数BigInteger s,这相当于普通二进制表示中的位数。 (计算(ceil(log2(this < 0 ? -this : this+1)))。)

+0

嗨吉姆,不错的方法和投票。其实我问的是一个更一般的问题,假设要计算'log_x',其中'x'可以是任何数字如'2,3,4,...',那么你如何计算?我认为'bigLength()'只能处理'2'指数的情况,对吧? –

+1

唯一的一般方法就是你所概述的方法。转换为'double'并在那里进行计算。 'BigInteger'可以表示超出'double'范围的值,所以在极端情况下您可能会丢失信息。 –

+1

参见http://stackoverflow.com/q/6827516/18157 –