I want to do left circular rotation for 64bit variables but my controller only operates in 8-bit, is it possible to do so?
问问题
202 次
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 回答