循环移位的应用

时间:2013-11-11 05:58:41

标签: algorithm math bit-manipulation bit-shift

我想知道一些循环移位应用的例子。例如,无符号整数的右移将导致除以2。相反,左移将导致乘以2.是否存在二进制数的循环移位的任何着名/有趣属性。

注意:右/左移位的示例是说明该特定运算符的应用。我要求循环移位运算符/函数的类似示例。

3 个答案:

答案 0 :(得分:5)

一个令人惊讶的地方,周围的轮班出现在约瑟夫斯幸存者的问题。在这个略带病态的问题中,n个人围成一圈。第一个人杀死第二个,然后第三个人杀死第四个,等等。这个过程重复,一个人杀死下一个人,直到只剩下一个人。问题是n人,哪个人幸存下来?

令人惊讶的是,通过在n上进行正确的循环移位来给出答案。 Graham,Knuth和Patashnik的书具体数学有很好的证据。

希望这有帮助!

答案 1 :(得分:2)

常规左移是乘以2(mod 2 ^ N),其中N是整数类型中的位数。

圆形左移是乘以2(mod(2 ^ N - 1))。所以这在做算术mod(2 ^ N-1)时很方便。

答案 2 :(得分:2)

  • 在big-endian和little-endian表示之间转换一个16位字:向右或向左循环移位8。
  • 生成具有偶数位设置的随机位集:t = rand(); result = t XOR cshift(t,1)
  • 就地,稳定和线性时间:将一些数组的所有元素移动到开头,将所有元素移动到奇数位置 - 到最后。本文描述了一种可能的算法:"In-Situ, Stable Merging by way of the Perfect Shuffle"(第7节)。它生成所有可能的二进制项链,并将它们用作循环引导算法的起始点,其中每个下一个位置是通过循环移位从前一个计算的。此应用程序与Henrik的答案中提及的2 (mod (2^N - 1))乘法密切相关。
  • 微优化。假设您需要从单个字节中解压缩四个2位字。您可以通过将每个子字移动到最右侧位置,然后使用适当的掩码应用AND操作来完成此操作。 (无需移动第一个子字或掩盖最后一个子字)。所有这些都需要6个CPU指令。如果将字节循环移位4,则两个中间子字成为第一个和最后一个,并且每个子字只需要一个指令。因此,使用循环移位可将所需指令的数量减少到5。
  • 当机器指令集包含旋转指令时,加密应用程序会显着加速。例如,Twofish Cipher广泛使用循环移位。