字符串构造BigInteger——BigInteger(char[] val, int sign, int len)
一、注释
使用基数为10的字符数组构造BigInteger,符号位是在构造函数外部预先计算出来的。
二、实现
- 跳过前导字符为0的元素,获取第一个不为0的元素下标。基于10进制判断字符是否为0。
- 如果计算出的非零元素下标和数组长度相同,则返回0。
- 表示字符数组需要的二进制位数。使用计算公式为:
2^x = R^L ==> x = log2(R^L) ==> x = L * log2(R)
R为基数:默认是10。
L为字符数
x为2进制位数。 - 根据二进制计算出int数组位数。
int numWords = (int) (numBits + 31) >>> 5;
- 通过取模获取第一个元素的十进制位数
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。