【问题标题】:I am looking for an algorithm to shuffle the first 25 bits of a (32-bit) int我正在寻找一种算法来洗牌(32 位)int 的前 25 位
【发布时间】: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


【解决方案1】:

首先,为了均匀起见,我们可以通过记住第 25 位将出现在交错列表的末尾,将问题扩展到 26 位 shuffle,因此我们可以在交错操作后将其修剪掉而不影响其他位的位置。

现在我们要交错第一组和第二组 13 位;但我们只有一种算法可以将第一组和第二组 16 位交错。

一种直接的方法可能是在应用标准算法之前将x 的高低部分移动到更可行的位置:

x = (x & 0x1ffe000) << 3 | x & 0x00001fff;

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;

每一半顶部的零将被交错并出现在结果的顶部。

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2013-12-03
    • 2011-08-14
    相关资源
    最近更新 更多