Quote (anyd @ 11 Dec 2016 20:30)
engem érdekel a megoldás, de nem sikerült rájönnöm. bár sosem voltam jó bitműveletekből
A feladat szempontjából egy teljes szintet optimalizál. A már meglátogatott állapotokat célzott kiszűrni, amit a digest (kivonat) segítégével oldok meg. A digest-ek set-ben tárolódnak.
Na már most, ezt a két állapotot ekvivalensnek tekintjük:
Code
1. szint: A-generátor
2. szint: A-chip
és
Code
1. szint: A-chip
2. szint: A-generátor
Egy szintről egy bitminta készül, hogy mi van ott. A páros bitek a generátorok, a páratlan bitek a chip-ek. A fenti példa bitmintája:
0110
1001
(Az egyszerűség kedvéért, csak két szint van, és csak egy elem, azaz egy generátor és egy chip.)
A két bitminta teljesen különböző, mégis ekvivalens.
Mi lenne, ha inkább úgy számolnánk, hogy egy bit az "A" kacatjaiból? Tehát, ha van egy chip: 01; ha van egy generátor: 01; ha mindkettő: 11; ha egyiksincs: 00.
Ebből adódik a következő táblázat:
Code
00 -> 00
01 -> 01
10 -> 01
11 -> 11
Vagyis ezt szeretnénk eljátszani az összes bit-párral.
Hogy is van a bitműveletek táblázata?
Code
A|B|(A&B)|(A|B)
0|0| 0 | 0
0|1| 0 | 1
1|0| 0 | 1
1|1| 1 | 1
(Megj.: a táblázatot direkt jó sorrendben állítottam össze.)
Csak a chip-ek bitjei: x & 0b01_0101_0101 (0x155)
Csak a generátorok bitjei: x & 0b10_1010_1010 (0x2AA)
Megoldás: a páratlan bitet úgy állítom elő, hogy össze-és-elem az eredeti bitet a páros bittel (amit fel kell shift-eljek eggyel).
Code
gs & (cs<<1)
A páros biteket úgy állítom elő, hogy összevagyolom a chip bit-jét az eggyel le-shift-elt generátor bittel:
[code]ms | (gs >> 1)[/code]
Ezek után az eredményt össze kell vagy-olni, tehát bitenként egyesíteni.
[code](gs & (cs << 1)) | (cs | (gs >> 1))[/code]
Az egész szépségét az adja, hogy mind az 5 félére egyszerre csinálja meg. A part2 esetén mind a 7-re egyszerre.