void rotate( unsigned long mask[], int rotateCnt );
此函数将当前 64 位掩码 (mask[]) 旋转 rotateCnt
位。如果rotateCnt
为正,则向左旋转;如果 rotateCnt
为负,则向右旋转。只有 rotateCnt
的低 6 位应该用于 rotateCnt
。
但我必须在模拟 1 个 64 位寄存器的 2 个 32 位寄存器中进行循环,在逻辑上跨两个 32 位寄存器执行 64 位操作。他们告诉我做 2 个循环,但我想不通?任何h
最佳答案
当您使用 x86 时,请查看 shld and shrd .您不需要循环(我不明白为什么他们要求循环)。
更新
这是一个 DevStudio 2005 风格的函数,它使用内联汇编程序来执行您想要的操作。不要在没有完全理解它是如何工作的情况下将其作为解决方案提出的(尤其是负计数如何正确旋转),因为你的老师很容易发现你在不知道它是如何工作的情况下复制了它(即老师:“这是如何工作的?”,你:“呃……”=> 失败)。
void Rotate
(
unsigned *value, // pointer to two 32bit integers
int count // number of bits to rotate: >= 0 left, < 0 = right
)
{
__asm
{
mov esi,value
mov eax,[esi]
mov edx,[esi+4]
mov ecx,count
mov ebx,eax
shld eax,edx,cl
shld edx,ebx,cl
test cl,32
jz noswap
xchg edx,eax
noswap:
mov [esi],eax
mov [esi+4],edx
}
}
关于c - 移入 2 个 32 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10434237/