Как преобразовать массив 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;
}