我发现的所有位洗牌算法都处理 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 但我可以从另一种语言转换算法)