如何将 UInt64 数组转换为 UInt16 数组以执行多精度乘法?
How do I convert an array of UInt64 to an array of UInt16 to perform multi-precision multiplication?
我需要在我的应用程序中执行快速伽罗华域运算。我有一个用汇编语言编写的乘法函数,它针对我的平台(一个 MSP430 微控制器)进行了优化。该函数计算两个任意大小的大数的乘积,但每个数必须表示为一个 16 位整数数组。但是,在我的项目中,Galois 域元素表示为 16 个 64 位整数的数组。如何将我的 16 个 64 位整数数组转换为我优化的、基于汇编的乘法函数所需的表示(即 64 个 16 位整数数组)?当然,简单地将数组转换为 (UInt16 *) 是行不通的。
MSP430 是小端架构。在此先感谢您的任何建议。
我不确定这是否是您想要的,而且这个解决方案在某种意义上是不完整的,因为它只是作为一个示例。此外,它是高度平台依赖的。它适用于我的机器 (little_endian)。我在 windows.
下使用 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;
}
正如@JohnBollinger 所提到的,我能够通过转换简单地将 uint64_t
数组的字节重新解释为 uint16_t
数组。出于某种原因,我认为字节必须以某种方式重新排序,但经过测试后我得到了正确的结果。由于其他不相关的问题,这最初对我不起作用。
我需要在我的应用程序中执行快速伽罗华域运算。我有一个用汇编语言编写的乘法函数,它针对我的平台(一个 MSP430 微控制器)进行了优化。该函数计算两个任意大小的大数的乘积,但每个数必须表示为一个 16 位整数数组。但是,在我的项目中,Galois 域元素表示为 16 个 64 位整数的数组。如何将我的 16 个 64 位整数数组转换为我优化的、基于汇编的乘法函数所需的表示(即 64 个 16 位整数数组)?当然,简单地将数组转换为 (UInt16 *) 是行不通的。
MSP430 是小端架构。在此先感谢您的任何建议。
我不确定这是否是您想要的,而且这个解决方案在某种意义上是不完整的,因为它只是作为一个示例。此外,它是高度平台依赖的。它适用于我的机器 (little_endian)。我在 windows.
下使用 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;
}
正如@JohnBollinger 所提到的,我能够通过转换简单地将 uint64_t
数组的字节重新解释为 uint16_t
数组。出于某种原因,我认为字节必须以某种方式重新排序,但经过测试后我得到了正确的结果。由于其他不相关的问题,这最初对我不起作用。