2017-02-02 2 views
2

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

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

+0

Использование бит-сдвига и маскировка. –

+1

Непонятно, что вы намерены. Если вы все равно 64-битные целые числа, почему бы не оставить это в компиляторе? – Olaf

+1

На маленькой машине вы можете просто 'memcpy()' содержимое 'uint64 []' на 'uint16 []'. – EOF

ответ

0

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

0

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

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; 
     }  
Смежные вопросы