对于我正在编写的解谜器,我正在寻找最快的算法(最少的位操作数)来转置拼图中每平方 2 位的 5x5 位板,因此:
00 01 02 03 04
05 06 07 08 09
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
变成
00 05 10 15 20
01 06 11 16 21
02 07 12 17 22
03 08 13 18 23
04 09 14 19 24
我能想到的最好的是
uint64_t transpose(uint64_t state) {
return ((state >> 16) & 0x10) |
((state >> 12) & 0x208) |
((state >> 8) & 0x4104) |
((state >> 4) & 0x82082) |
((state << 4) & 0x820820) |
((state << 8) & 0x410400) |
((state << 12) & 0x208000) |
((state << 16) & 0x100000);
}
但感觉这可以通过显着减少的操作来完成。有谁知道更快的解决方案?也非常欢迎参考有关该主题的优秀文献。