2017-03-16 111 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 –