3 回答
TA貢獻1828條經(jīng)驗 獲得超13個贊
ABigInteger可以轉(zhuǎn)換為byte[]using?BigInteger.toByteArray()。
請注意,在該示例中int可以替換為。byte
TA貢獻1943條經(jīng)驗 獲得超7個贊
Stringin的最大范圍Java是2^31 - 1正確的,但這與它可以容納的數(shù)字的最大值無關(guān),而是與它可以包含的字符數(shù)有關(guān)。
也就是說,您不需要 BigInteger 來查找數(shù)字中設(shè)置的位數(shù)(即使對于很大的數(shù)字),只需記住查找數(shù)字的二進制表示的方法即可。
前任:
2|12|0
2| 6|0
2| 3|1
2| 1|-
所以從上面我們知道12的二進制表示是1100。如果知道數(shù)字的二進制表示,我們可以很容易地計算出設(shè)置位數(shù)。
來到這個問題,你知道你不能處理那么大的數(shù)字,所以使用一個字符串來存儲數(shù)字并執(zhí)行上面的方法。
要劃分存儲在字符串中的數(shù)字,請從數(shù)字的開頭部分開始劃分,即十進制數(shù)的最高有效位。檢查它是否向右傳播一個進位,您可以通過一個簡單的方式來做到這一點,&1它會告訴您這些數(shù)字的 LSB。最后,用 b 計算設(shè)置位的數(shù)量。
public class Expelliarmus{
public static void main(String[] args) {
String a = "9000000000000000000000000000000000000000000000000000000000000000000000000000000000000";//88 zeroes, you can test it for other numbers too
System.out.println(fn(a,0L));
}
static long fn(String a, long b){ // Don't ask why I used long here
if(a.length()==0) return b;
if(a.length()==1 && a.charAt(0)=='1') return ++b;
int n = Integer.parseInt(a.charAt(a.length()-1)+"");
if((n&1)==1) ++b;
a = divideMe(a);
return fn(a,b);
}
static String divideMe(String a){
int val = 0;
String bb = "";
for(int i=0;i<a.length();i++){
int dup = 0;
val = val*10 + Integer.parseInt(a.charAt(i)+"");
if((val&1)==1) dup = 1;
val = val/2;
bb = bb + String.valueOf(val);
val = dup;
}
if(bb.charAt(0)=='0') return bb.substring(1);
return bb;
}
}
TA貢獻1828條經(jīng)驗 獲得超3個贊
bitCount()您可以使用以下方法:
// So, we create a big number
BigInteger num = new BigInteger("10");
num = num.pow(200);
System.out.println(num.bitCount());
只是為了好玩,您可以測試它是否為您提供了正確的數(shù)字:
String binaryNum = num.toString(2);
System.out.println(binaryNum);
System.out.println(binaryNum.chars().filter(c -> c == '1').count());
添加回答
舉報
