Java – Как BigInteger преобразует строки в их внутреннее представление?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java – Как BigInteger преобразует строки в их внутреннее представление?

Сообщение Anonymous »

Я занимаюсь небольшим побочным проектом, в котором углубляюсь в реализацию некоторых популярных классов, которые мы используем в библиотеках Java.
Первый в моем списке — 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»