16、32 或 64 位处理器执行多少个原始操作来执行 N 位二进制数的逻辑右移?

How many number of primitive operations does a 16, 32 or a 64-bit processor execute to perform logical right shift of an N-bit Binary number?

最近,我一直在尝试了解二进制扩展欧几里德算法在处理器级别的工作原理。这道题是关于在 GF(2^m) 中以多项式为基础求一个逆元素。

一般来说,我遇到了用于评估逆元素的扩展欧几里德算法,但事实是它涉及太多的加法和乘法运算。二进制 EEA 算法只需要移位操作(相当于除以 2——逻辑右移)。算法在this link, page number 8.

在该算法的第3步和第5步中,每次迭代将参数ub右移1位,同时向MSB加零。当u == 1和returnsb时循环结束。我的问题是处理器(例如 32 位处理器)在每次迭代的第 3 步或第 5 步中执行多少原始操作?

我遇到了桶形移位器,我对移位的速度有多快感到很困惑。我真的应该考虑这些原始操作还是应该忽略它们因为移位可能更快?

如果有人能展示 u 的大小为 194 位的情况下的原始操作,那将对我有很大帮助。


如果您可能想知道算法第 3 步和第 5 步中的分母 x,它是多项式表示,x 仅表示二进制和参数中的 10 u是一个N位的二进制数。

通常有一个 "right shift" 汇编 OP 代码,它能够将寄存器右移给定的位数。这样一个操作需要一个周期。

这假设您的值已经加载到寄存器中。

最好的答案是:用低级语言(C、C++)实现这个算法并查看编译器生成的汇编代码。

这个问题没有通用的答案:您可以使用优化起来很乏味的可移植代码,或者使用高度机器特定的代码,这些代码在不破坏的情况下优化起来会更加复杂。

如果你想要真正的性能,你必须在你能得到的最大宽度上使用 MMX/AVX 寄存器。英特尔在低级指令上提供轻量级包装器作为宏和内联函数。

在移位操作中始终使用无符号类型以避免不必要的步骤。