Предисловие
Я изучаю компьютерную математику, написав и улучшив свою собственную библиотеку BigInt.До сих пор в моем первом воплощении каждая цифра из 10 базовых чисел сохранялась в последовательных элементах вектора.Он может умножаться и складываться с произвольной точностью.Я хочу ускорить его, используя все доступное мне пространство в стандартном типе данных C ++ путем преобразования в базу 2 ^ x.
Информация
Я читаю 1000 или более цифр изstdin в базе 10, и я хочу преобразовать их в базу 2 ^ x, чтобы я мог легко хранить их в массиве или векторе одного из стандартных типов данных C ++, вероятно, без знака int.У меня есть только одна идея, как сделать базовое преобразование, повторное деление с использованием метода остатка.Вот некоторый код C ++, описывающий этот метод:
vector<int> 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 (цифры в base10 / 2)ts.
- В качестве основы 256 наш вектор выглядит следующим образом: [7,91,205,21]
Очевидно, что третье решение является наиболее оптимальным для внутреннего представленияи это то, к чему я пытаюсь добраться.