Initialize `magic_sum[2] = {0x1111111111111111ull, 0x1111111111111111ull}'. Accumulate on them the magic_table entries for the squares occupied by each player. You can then use the code below to see if putting a new stone creates a new mill.
u64 magic_table[24] = {
0x1000000010000000ull,
0x1000000000010000ull,
0x1000000000000001ull,
0x0100000001000000ull,
0x0100000000010000ull,
0x0100000000000010ull,
0x0010000000100000ull,
0x0010000000010000ull,
0x0010000000000100ull,
0x0001000010000000ull,
0x0001000001000000ull,
0x0001000000100000ull,
0x0000100000000100ull,
0x0000100000000010ull,
0x0000100000000001ull,
0x0000010000100000ull,
0x0000010000001000ull,
0x0000010000000100ull,
0x0000001001000000ull,
0x0000001000001000ull,
0x0000001000000010ull,
0x0000000110000000ull,
0x0000000100001000ull,
0x0000000100000001ull
};
u64 new_mills(u64 magic_sum, int square) {
u64 before_mills = magic_sum & 0x4444444444444444ull;
u64 after_mills = (magic_sum + magic_table[square]) & 0x4444444444444444ull;
return after_mills & ~before_mills;
}
EDIT: I fixed a mistake in the code.
Edited by Álvaro, 12 March 2013 - 05:57 PM.