如何将UInt64数组转换为UInt16数组以执行多精度乘法?

时间:2017-02-02 20:07:12

标签: c arrays galois-field montgomery-multiplication

我需要在我的应用程序中执行快速Galois域算术。我有一个用汇编编写的乘法函数,它已针对我的平台MSP430微控制器进行了优化。该函数计算两个大量任意大小的乘积,但每个数字必须表示为16位整数数组。但是,在我的项目中,Galois字段元素表示为16个64位整数的数组。如何将我的16位64位整数数组转换为我优化的基于汇编的乘法函数(即64位16位整数数组)所需的表示?当然,简单地将数组转换为(UInt16 *)是行不通的。

MSP430是一种小端架构。提前感谢任何建议。

2 个答案:

答案 0 :(得分:0)

我不确定这是否是你想要的,而这个解决方案在某个意义上是不完整的。此外,它是高度平台可靠的。它适用于我的机器(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;
      }      

答案 1 :(得分:0)

正如@JohnBollinger所提到的,我能够通过强制转换将uint64_t数组的字节简单地重新解释为uint16_t的数组。出于某种原因,我认为字节必须以某种方式重新排序,但经过测试后我得到了正确的结果。由于其他无关的问题,这对我来说最初没有用。