symmetrical for white/black move generation using bitboards.
This can be circumvented by the following:
Code: Select all
const int MirrorTable[2][64] = {
{
0, 1, 2, 3, 4, 5, 6, 7,
8, 9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,
56,57,58,59,60,61,62,63,
},{
56,57,58,59,60,61,62,63,
48,49,50,51,52,53,54,55,
40,41,42,43,44,45,46,47,
32,33,34,35,36,37,38,39,
24,25,26,27,28,29,30,31,
16,17,18,19,20,21,22,23,
8, 9,10,11,12,13,14,15,
0, 1, 2, 3, 4, 5, 6, 7,
}
};
inline int FirstOneSym(int wtm, U64 A)
{
int sqr[2];
sqr[0] = FirstOne(A);
sqr[1] = FirstOne(bswap(A));
return MirrorTable[wtm][sqr[wtm]];
}
inline int LastOneSym(int wtm, U64 A)
{
int sqr[2];
sqr[0] = LastOne(A);
sqr[1] = LastOne(bswap(A));
return MirrorTable[wtm][sqr[wtm]];
}
Code: Select all
fr = tr->wtm ? LastOne(Pcs) : FirstOne(Pcs);
to = tr->wtm ? FirstOne(Atk) : LastOne(Atk);
Code: Select all
fr = LastOneSym(tr->wtm,Pcs);
to = FirstOneSym(tr->wtm,Atk);
My own tests show that this is slightly slower than the old code.
Regards, Lasse