Как преобразовать массив UInt64 в массив UInt16 для выполнения умножения с множественной точностью?

Мне нужно выполнить быструю арифметику Галуа в моем приложении. У меня есть функция умножения, написанная на ассемблере, которая была оптимизирована для моей платформы, микроконтроллера MSP430. Эта функция вычисляет произведение двух больших чисел произвольного размера, но каждое число должно быть представлено в виде массива 16-битных целых чисел. Однако в моем проекте элемент поля Галуа представлен в виде массива из 16 64-битных целых чисел. Как преобразовать мой массив из 16 64-разрядных целых чисел в представление, необходимое для моей оптимизированной функции умножения на основе ассемблера (т.е. массив из 64 16-разрядных целых чисел)? Конечно, простое приведение массива как (UInt16 *) не работает.

MSP430 - это архитектура с прямым порядком байтов. Спасибо заранее за любые предложения.

2 ответа

Решение

Как уже упоминалось @JohnBollinger, я смог просто переосмыслить байты массива uint64_t как массив uint16_t путем кастинга. По какой-то причине я думал, что байты нужно каким-то образом переупорядочить, но после тестирования я получаю правильные результаты. Изначально это не сработало для меня из-за других не связанных с этим вопросов.

Я не уверен, если это то, что вы хотите, и это решение является неполным в том смысле, что оно просто служит примером. Кроме того, это очень зависит от платформы. Это работает на моей машине (little_endian). Я использую код: блоки под окнами.

   typedef struct {
             uint16_t lo_word0;
             uint16_t hi_word0;
             uint16_t lo_word1;
             uint16_t hi_word1;
              }struct_t;



    int main()
    {
       uint64_t buff_64[4]={0xaaaabbbbccccdddd,0xbbbbccccddddeeee,0x1111222233334444,0x8888aaaabbbbcccc};
       uint16_t buff_16[16];
      /*Please note that you may use simply:
        memcpy(buff_16,buff_64,32); 
        however that would result in reverse order
        with respect to the code below */

       struct_t *ptr = (struct_t *)buff_64;

       for(int j=0; j<16; ptr++)
       {
         buff_16[(j++)%16]=ptr->hi_word1;
         buff_16[(j++)%16]=ptr->lo_word1;
         buff_16[(j++)%16]=ptr->hi_word0;
         buff_16[(j++)%16]=ptr->lo_word0;

       } 
        // The check
        for(int j=0;j<16;j++)
        printf("%x\n",buff_16[j]);  

        return 0;
      }      
Другие вопросы по тегам