Умножение массива со знаком в целочисленной системе - PullRequest
0 голосов
/ 30 апреля 2020

Умножение массива целых чисел без знака довольно просто. Допустим, у вас есть два целых числа 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......
}

Но как нам это сделать с целыми числами со знаком с системой двухбитового дополнения?

Обратите внимание, что двухбитная система дополнения должна применяться ко всему массиву целых чисел. Не в каждом элементе массива.

...