Умножение массива целых чисел без знака довольно просто. Допустим, у вас есть два целых числа a
и b
, каждое из которых представляет собой целые числа без знака размером 8 x 32 бита. Затем вы умножаете [0] xb [0] и сохраняете результат в 64-битном целом числе без знака. Младшие 32 бита присваиваются результату, а старшие 32 бита переносятся на следующее умножение элемента. И вы продолжите, пока не умножите все элементы в обоих массивах:
#include <cstdint>
typedef std::uint32_t U32;
typedef std::uint64_t U64;
union M64
{
U64 u64;
struct
{
U32 lo, hi;
} u32;
};
void multiply(U32* r, U32* a, U32* b)
{
M64 c;
c.u64 = a[0] * b[0];
r[0] = c.u32.lo;
c.u64 = a[1] * b[0] + c.u32.hi;
r[1] = c.u32.lo;
// etc......
c.u64 = a[0] * b[1] + c.u32.hi;
r[1] = c.u32.lo;
c.u64 = a[1] * b[1] + c.u32.hi;
r[2] = c.u32.lo;
// etc......
}
Но как нам это сделать с целыми числами со знаком с системой двухбитового дополнения?
Обратите внимание, что двухбитная система дополнения должна применяться ко всему массиву целых чисел. Не в каждом элементе массива.