【问题标题】:Bitwise operations on 128-bit values on a non-sse2 arch非 sse2 架构上 128 位值的按位运算
【发布时间】:2019-10-22 18:37:16
【问题描述】:

我正在用 C 语言编写一个针对嵌入式平台的例程。
在例程中,我需要对 128 位值执行按位 XORSHIFT RIGHT 操作。
目标架构没有 SSE2,因此不支持原生 128 位操作。
我遇到了this 答案,它在软件中模拟了SHIFT 操作。
我的问题是,有没有更好的方法来做到这一点,我的意思是用更好的数据结构来表示 128 位值和模拟 SHIFT 和 XOR 操作的最佳方法而不是使用递归(如链接中的答案所做的那样) .我希望尽量减少对有限堆栈内存的使用。

【问题讨论】:

    标签: c bit-manipulation bitwise-operators 128-bit


    【解决方案1】:

    你可以使用一个结构来存储128位数据,如下所示

    typedef struct
    {
        uint32_t a;
        uint32_t b;
        uint32_t c;
        uint32_t d;
    } Type_128bit;
    

    那么你可以写一个左移函数如下

    int leftshift(Type_128bit in, Type_128bit out, int value)
    {
        int val;
        if (value >= 128)
        {
            return (-1); // error condition
        }
        else if (value < 32)
        {
            out->a = (in->a << value) | (in->b >> value);
            out->b = (in->b << value) | (in->c >> value);
            out->c = (in->c << value) | (in->d >> value);
            out->d = in->d << value;
        }
        else if (value < 64)
        {
            val = value - 32;
            out->a = (in->b << val) | (in->c >> val);
            out->b = (in->c << val) | (in->d >> val);
            out->c = (in->d << val);
            out->d = 0x00;
        }
        else if (value < 96)
        {
            val = value - 64;
            out->a = (in->c << val) | (in->d >> val);
            out->b = (in->d << val);
            out->c = 0x00;
            out->d = 0x00;
        }
        else // value < 128
        {
            val = value - 96;
            out->a = (in->d << val);
            out->b = 0x00;
            out->c = 0x00;
            out->d = 0x00;
        }
        return (0); //success
    }
    

    这将避免上述解决方案的递归并提供更好的运行时间。但是代码量会增加,你需要仔细测试代码。

    【讨论】:

      【解决方案2】:
      uint32_t *shiftL(uint32_t *val, const size_t size, const size_t nbits)  // <= 32
      {
          uint32_t mask = (1 << nbits) - 1;
      
          mask <<= 32 - nbits;
      
          for(size_t cword = size; cword - 1 ; cword --)
          {
              uint32_t temp = (val[cword - 2] & mask) >> nbits
              val[cword - 1] <<= nbits;
              val |= temp;
          }
          val[0] <<= nbits;
          return val;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        相关资源
        最近更新 更多