2

I want to do left circular rotation for 64bit variables but my controller only operates in 8-bit, is it possible to do so?

4

2 回答 2

1

假设 64 位变量是 little-endian。就地修改它。

void rol(unsigned char a[8], int b){
    unsigned char c[8];
    unsigned char t, u;
    int i, j;

    /* Clamp b to [0, 63] */
    b &= 63;

    /* First rotate by 0 to 7 whole bytes (0 to 56 bits in multiples of 8) */
    for(i=0, j=b/8;i<8;i++){
        c[j] = a[i];

        j++;
        j &= 7;
    }

    /* Second, rotate by 0 to 7 bits, depending on what's left */
    b &= 7;

    if(b){/* Shift by 1 to 7 bits using bitwise ops into output */
        for(i=0, j=7;i<8;i++){
            u = c[i] << (b);
            t = c[j] >> (8-b);

            a[i] = u | t;

            j++;
            j &= 7;
        }
    }else{/* Shift by 0 bits = copy into output */
        for(i=0;i<8;i++){
            a[i] = c[i];
        }
    }
}
于 2013-10-15T23:29:37.440 回答
1

当然,这样做是可能的。这只是它必须有多高效的问题。

通过顺序移位字节,检查从每个 8 位字节“移出”的位并将其转移到下一个 8 位字节,可以简单地实现 1 位循环。

n通过执行一系列 1 位旋转,可以以“哑”方式实现逐n位旋转。

一种不那么“愚蠢”的方法是执行整个字节的循环重新分配(旋转)n / 8时间,然后用n % 8顺序的 1 位旋转完成它。即 19 位旋转 = 2 个全字节旋转后跟 3 个 1 位旋转。

您可能还会观察到,在 64 位字中,向左旋转 63 位与向右旋转 1 位相同,这意味着如果您可以使用左右圆形旋转,那么您永远不必旋转超过32 位。

如果目标字长被 64 位限制,那么这可能已经足够了。

于 2013-10-16T00:08:25.523 回答