我正在用C编写一个针对嵌入式平台的例程,在例程中我需要对128位值执行按位XORSHIFT RIGHT操作。目标架构没有SSE2,因此不支持本机128位操作。我遇到了this答案,该答案模拟了软件中的SHIFT操作。
我的问题是,有没有更好的方法可以做到这一点,我的意思是与使用递归相比,具有更好的数据结构来表示128位值以及模拟SHIFT和XOR操作的最佳方法(如链接中的答案所示)。我希望最小化有限堆栈内存的使用。

最佳答案

您可以使用一种结构来存储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
}


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

关于c - 非sse2拱上的128位值的按位运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56491182/

10-11 18:11