Преобразование больших целых чисел с основанием счисления с 10 ^ x в 2 ^ x

Предисловие

Я изучаю компьютерную математику, написав и улучшив свою собственную библиотеку BigInt. До сих пор мое первое воплощение хранит каждую цифру числа с основанием 10 в последовательных элементах вектора. Он может умножать и складывать с произвольной точностью. Я хочу ускорить его, используя все доступное мне пространство в стандартном типе данных C ++ путем преобразования в базу 2 ^ x.

Информация

Я читаю 1000 или более цифр из стандартного ввода в базе 10, и я хотите преобразовать их в базу 2 ^ x, чтобы я мог легко хранить их в массиве или векторе одного из стандартных типов данных C ++, вероятно, без знака int. У меня есть только одна идея, как сделать базовое преобразование, метод повторного деления с остатком. Вот некоторый код C ++, описывающий этот метод:

vector digits;
while(num!=0) {
   int mod = num%base;
   num = num/base;
   digits.push_back(mod);
}

Загадки

Я не могу понять, является ли деление с остатком правильным способом преобразования системы счисления для больших целых чисел. Я попытался посмотреть, как это делает библиотека GMP . gmp / mpn / generic / set_str.c - соответствующий исходный файл c, в котором происходит «волшебство», но я не уверен, что там происходит. Мэтт Маккатчен BigInt , похоже, использует метод повторного деления с остатком. Если я все же использую этот метод, мне, по сути, нужно написать две версии моего класса BigInt, одну для работы в Base10, а другую для Base2 ^ x.

Заключение

  • Предложите рекомендации по правильным шагам для преобразования огромного числа из строка в массив из 32-битных слов.
  • Помогите мне узнать, как GMP преобразует строку в массив из 32-битных слов, не пробираясь через множество уровней абстракции.

Примеры Использование 4-битного размера слова

Число, которое мы хотим для хранения (очевидно, небольшого размера): 123456789

беззнаковые символы имеют диапазон от 0 до 255, если мы хотим разделить наше число и сохранить его в векторе, мы можем сделать это одним из трех способов:

  • В качестве основы 10 наш вектор выглядит так: [1,2,3,4,5,6,7,8,9]
    • Так мой вектор выглядел в моей первой реализации.
  • В качестве базы 100 наш вектор выглядит так: [1,23,45,67,89]
    • Легко преобразовать из базы 10 в базу 100, имеет элементы ciel (цифры в базе10 / 2).
  • В качестве базы 256 наш вектор выглядит так: [7,91,205,21]

Очевидно третье решение является наиболее оптимальным для внутреннего представления, и это то, к чему я пытаюсь добраться.

6
задан frontendloader 7 June 2011 в 01:08
поделиться