I am using 64-bit integers as groups of 16 four-bit integers ("nibbles") which count how many pieces a player has in each possible mill on the board. The table indicates which mills each square participates in (one horizontal, one vertical). Since I want to detect situations where the mill counts reach 3, I use a trick where I initialize all the counters to 1 instead of 0, because detecting if a nibble has reached 4 is a bit simpler than detecting if it has reached 3: That's what "&amp; 0x4444444444444444ull" does.
So to make sure I'm following how did you define the board in order to find out the bits in the table?
I defined my board as a 1D array of 24 positions and it set it up like this:
// 0 1 2
// 3 4 5
// 6 7 8
// 9 10 11 12 13 14
// 15 16 17
// 18 19 20
// 21 22 23
So, taking as an example the first entry (ie. 0x1000000010000000ull), why did you decide to set the 1st and 8th bit?
By accumulating do you mean adding?
Also I had to change the code to Java. Java has 64bit long but not unsigned. I tried to do the following:
long m1 = magic_sum + magic_table + magic_table + magic_table;
long m2 = magic_sum;
long t1 = new_mills(m1, 0);
long t2 = new_mills(m2, 1);
The result of m1 is 4688547452336345362, m2 is 1229782938247303441 whilst both t1 and t2 return 0. I don't think is correct.