Первый в моем списке — BigInteger. Мне интересно понять алгоритм, с помощью которого строка преобразуется в число для внутреннего представления.
Это фрагмент кода, который меня интересует:
Код: Выделить всё
// Pre-allocate array of expected size. May be too large but can
// never be too small. Typically exact.
long numBits = ((numDigits * bitsPerDigit[radix]) >>> 10) + 1;
if (numBits + 31 >= (1L >> 5;
int[] magnitude = new int[numWords];
// Process first (potentially short) digit group
int firstGroupLen = numDigits % digitsPerInt[radix];
if (firstGroupLen == 0)
firstGroupLen = digitsPerInt[radix];
String group = val.substring(cursor, cursor += firstGroupLen);
magnitude[numWords - 1] = Integer.parseInt(group, radix);
if (magnitude[numWords - 1] < 0)
throw new NumberFormatException("Illegal digit");
// Process remaining digit groups
int superRadix = intRadix[radix];
int groupVal = 0;
while (cursor < len) {
group = val.substring(cursor, cursor += digitsPerInt[radix]);
groupVal = Integer.parseInt(group, radix);
if (groupVal < 0)
throw new NumberFormatException("Illegal digit");
destructiveMulAdd(magnitude, superRadix, groupVal);
}
// Required for cases where the array was overallocated.
mag = trustedStripLeadingZeroInts(magnitude);
if (mag.length >= MAX_MAG_LENGTH) {
checkRange();
}
Мои вопросы следующие:
- < li>Что означает bitsPerDigit? Если запустить отладчик, то получится 3402. Это количество бит, используемых в цифре int в Java?
- Зачем делить результат (numDigits * bitsPerDigit[radix]) на 2^ 10 и прибавьте 1 ? (Логический сдвиг вправо — это деление степени на 2).
- Зачем прибавлять 31 к numBits перед делением на 2^5 = 32< /код>? (Я понимаю, что 32 бита — это размер int в Java).
- Что такое разрушительныйMulAdd? Как это работает?
- Эти алгоритмы где-то задокументированы?
Подробнее здесь: https://stackoverflow.com/questions/764 ... esentation