首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将UInt64数组转换为UInt16数组以执行多精度乘法?

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

Stack Overflow用户
提问于 2017-02-03 04:07:12
回答 2查看 138关注 0票数 2

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

MSP430是一种小端的体系结构。提前感谢您的任何建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-04 06:05:43

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

票数 0
EN

Stack Overflow用户

发布于 2017-02-03 11:43:23

我不确定这是否是您想要的,这个解决方案在某种意义上是不完整的,因为它只是一个例子。此外,它还具有高度的平台可靠性。它可以在我的机器(little_endian)上运行。我使用的是windows下的Code:Block。

代码语言:javascript
复制
   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;
      }      
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42011382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档