Для решателя головоломок, который я пишу, я ищу самый быстрый алгоритм (минимальное количество битовых операций) для транспонирования битовой доски 5x5 с 2 битами на квадрат в головоломке, поэтому:
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);
}
Но кажется, что это можно сделать с помощью значительно меньшего количества операций. Кто-нибудь знает более быстрое решение? Также приветствуются ссылки на хорошую литературу по теме.
transpose(1)
, кажется, возвращает неверный результат. - person user2357112 supports Monica   schedule 22.03.2015transpose
основаны на битовой доске 1 бит на квадрат. - person user2357112 supports Monica   schedule 22.03.2015