【发布时间】:2013-08-08 16:17:17
【问题描述】:
我发现的所有位洗牌算法都处理 16 位或 32 位,这意味着即使我只使用 int 的前 25 位,洗牌也会将位留在外面。此函数位于 CPU 密集型进程的内部循环中,因此我希望它尽可能快。我试过修改 Hacker's Delight 32-bit shuffle 算法的代码
x = (x & 0x0000FF00) << 8 | (x >> 8) & 0x0000FF00 | x & 0xFF0000FF;
x = (x & 0x00F000F0) << 4 | (x >> 4) & 0x00F000F0 | x & 0xF00FF00F;
x = (x & 0x0C0C0C0C) << 2 | (x >> 2) & 0x0C0C0C0C | x & 0xC3C3C3C3;
x = (x & 0x22222222) << 1 | (x >> 1) & 0x22222222 | x & 0x99999999;
但我在做一些事情时遇到了困难,部分原因是我不确定这些面具是从哪里来的。我尝试改变数字并重新洗牌,但到目前为止结果都是徒劳的。任何帮助将不胜感激!
(我使用的是 C 但我可以从另一种语言转换算法)
【问题讨论】:
-
你能解释一下你想要的位的确切排列吗?据我所知,“随机播放”仅对偶数位有意义。顺便说一句,你可以在这里填写(排列):programming.sirrida.de/calcperm.php 并让它为你生成代码
-
请告知:通过“洗牌”,我假设您希望将
int的最低有效 25 位以看似随机的方式重新排列到 LS 25 位中。因此,如果 x 在其 25 个 LS 位中设置了 9 位,则 shuffle(x) 也将在 LS 25 位中设置 9 位。 -
每行有三个部分是 ORed 在一起的。第一部分(例如:(x & 0x0000FF00) > 8) & 0x0000FF00) 将一组位向下移动 X 位位置。最后一块抓取未移动的剩余位(x & 0xFF0000FF)并将它们包含在结果中。将数字和字母分配给位,这开始 ABCDEFGHIJKLMNOPQRSTUVWXYZ012345 并变为 ABCDEFGHQRSTUVWXIJKLMNOPYZ012345、ABCDQRSTEFGHUVWXIJKLYZ01MNOP2345、ABQRCDSTEFUVGHWXIJYZKL01MN23OP45,最后是 AQBRCSDTEUFVGWHXIYJZK0L1M2N3O4P5
-
嘿user2665197,请回来,我还是很好奇这个
-
@harold:看起来像
0000000YXWVUTSRQPONMLKJIHGFEDCBA->0000000MYLXKWJVIUHTGSFREQDPCOBNA-> 可能是什么意思?将其称为 26 位 shuffle,因为我们知道 Z 为 0,并且会落在 shuffle 位的末尾。
标签: c bit-manipulation