Как сказано в комментариях, лучшим решением, вероятно, будет использование библиотеки, которая сделает это за вас. Но я объясню, как вы можете сделать это без библиотеки, потому что я думаю, что вы просили кое-что узнать. Возможно, это не очень эффективный способ, но он работает.
Когда мы учились в школе и нам приходилось умножать 2 числа без калькулятора, мы умножали 2 цифры, получали результат с 1-2 цифрами, записывали их и в конце концов складывали. Мы назло умножили, поэтому нам нужно было вычислить только однозначное умножение за раз. Аналогичная вещь возможна с более высокими числами на ЦП. Но там мы не используем десятичные разряды, мы используем в качестве разряда половину размера регистра. При этом мы можем умножить 2 цифры и получить 2 цифры в одном регистре. В десятичном виде 13*42 можно рассчитать как:
3* 2 = 0 6
10* 2 = 2 0
3*40 = 1 2 0
10*40 = 0 4 0 0
--------
0 5 4 6
То же самое можно сделать и с целыми числами. Чтобы упростить задачу, я умножаю 2 8-битных числа на 16-битное число на 8-битном процессоре, для этого я умножаю только 4 бита на 4 бита за раз. Давайте умножим 0x73 на 0x4F.
0x03*0x0F = 0x002D
0x70*0x0F = 0x0690
0x03*0x40 = 0x00C0
0x70*0x40 = 0x1C00
-------
0x22BD
Вы в основном создаете массив с 4 элементами, в вашем случае каждый элемент имеет тип uint32_t
, сохраняете или добавляете результат одного умножения в правильный элемент (ы) массива, если результат одного умножения слишком велик для один элемент, сохраните старшие биты в старшем элементе. Если дополнение переполняется, перенос 1 к следующему элементу. В итоге можно объединить 2 элемента массива, в вашем случае до двух uint64_t
.
person
12431234123412341234123
schedule
02.10.2020
unsigned __int128
в gcc), либо встроенный доступ к расширяющей инструкции умножения, которую предоставляет большинство машин. - person Nate Eldredge   schedule 02.10.2020uint32
. Надеялся получить что-нибудь с полки здесь. Спасибо. - person goodvibration   schedule 02.10.2020uint256
. Я разместил вопрос и в C, потому что я надеялся получить быстрый ответ. Я разместил его без указания платформы, потому что ищу чисто арифметическое решение (потому что я, очевидно, не могу полагаться на какое-либо аппаратное обеспечение и/или компилятор). - person goodvibration   schedule 02.10.2020