BigInteger构造函数一

142 阅读1分钟

字符串构造BigInteger——BigInteger(char[] val, int sign, int len)

一、注释

使用基数为10的字符数组构造BigInteger,符号位是在构造函数外部预先计算出来的。

二、实现

  1. 跳过前导字符为0的元素,获取第一个不为0的元素下标。基于10进制判断字符是否为0。
  2. 如果计算出的非零元素下标和数组长度相同,则返回0。
  3. 表示字符数组需要的二进制位数。使用计算公式为:
    2^x = R^L ==> x = log2(R^L) ==> x = L * log2(R)
    R为基数:默认是10。
    L为字符数
    x为2进制位数。
  4. 根据二进制计算出int数组位数。
int numWords = (int) (numBits + 31) >>> 5;
  1. 通过取模获取第一个元素的十进制位数
int firstGroupLen = numDigits % digitsPerInt[radix];
if (firstGroupLen == 0)
    firstGroupLen = digitsPerInt[radix];

digitsPerInt数组:保存的是基数下int可以保存的最大位数,数组的下标就是基数。如10进制下 10^9 < 2^31 - 1 < 10^10,所以digitsPerInt[10] = 9,即表示一个int元素可以保存9位十进制字符。
6. 计算int数组中每一个的值,主要使用方法如下

destructiveMulAdd(int[] x, int y, int z)

如给定字符数组{'1', '2', '3'},方法的作用类似于 1 * 10^2 + 2 * 10^1 + 3 * 10^0。
7. 最后去除结果数组中的前导0。