Normal (white) magic bitboards work like
Code: Select all
index = ((occ & mask) * magic) >> (64-n);Black magic bitboards work like
Code: Select all
index = ((occ | black_mask) * black_magic) >> (64-n);With black magics there is always something nonzero to multiply with, which has two advantages for getting more compact lookup tables than with white magics.
- It is easy to see, that with white magics index == 0 is always used for the empty board. Black magics make it possible to get lookup tables with unused entries at the beginning.
- More bits from the magic factor contribute to the calculated index, giving more magic factors to chose from.
Here the best black magics so far. I think there are still some bytes to squeeze out. The position field is where to place index == 0 for that factor in the global lookup_table. This may be an unused entry.
Code: Select all
uint64_t lookup_table[88507];
struct
{
	uint64_t factor;
	int position;
}
bishop_magics[64] =
{
	{ 0x107ac08050500bffull,  66157 },
	{ 0x7fffdfdfd823fffdull,  71730 },
	{ 0x0400c00fe8000200ull,  37781 },
	{ 0x103f802004000000ull,  21015 },
	{ 0xc03fe00100000000ull,  47590 },
	{ 0x24c00bffff400000ull,    835 },
	{ 0x0808101f40007f04ull,  23592 },
	{ 0x100808201ec00080ull,  30599 },
	{ 0xffa2feffbfefb7ffull,  68776 },
	{ 0x083e3ee040080801ull,  19959 },
	{ 0x040180bff7e80080ull,  21783 },
	{ 0x0440007fe0031000ull,  64836 },
	{ 0x2010007ffc000000ull,  23417 },
	{ 0x1079ffe000ff8000ull,  66724 },
	{ 0x7f83ffdfc03fff80ull,  74542 },
	{ 0x080614080fa00040ull,  67266 },
	{ 0x7ffe7fff817fcff9ull,  26575 },
	{ 0x7ffebfffa01027fdull,  67543 },
	{ 0x20018000c00f3c01ull,  24409 },
	{ 0x407e0001000ffb8aull,  30779 },
	{ 0x201fe000fff80010ull,  17384 },
	{ 0xffdfefffde39ffefull,  18778 },
	{ 0x7ffff800203fbfffull,  65109 },
	{ 0x7ff7fbfff8203fffull,  20184 },
	{ 0x000000fe04004070ull,  38240 },
	{ 0x7fff7f9fffc0eff9ull,  16459 },
	{ 0x7ffeff7f7f01f7fdull,  17432 },
	{ 0x3f6efbbf9efbffffull,  81040 },
	{ 0x0410008f01003ffdull,  84946 },
	{ 0x20002038001c8010ull,  18276 },
	{ 0x087ff038000fc001ull,   8512 },
	{ 0x00080c0c00083007ull,  78544 },
	{ 0x00000080fc82c040ull,  19974 },
	{ 0x000000407e416020ull,  23850 },
	{ 0x00600203f8008020ull,  11056 },
	{ 0xd003fefe04404080ull,  68019 },
	{ 0x100020801800304aull,  85965 },
	{ 0x7fbffe700bffe800ull,  80524 },
	{ 0x107ff00fe4000f90ull,  38221 },
	{ 0x7f8fffcff1d007f8ull,  64647 },
	{ 0x0000004100f88080ull,  61320 },
	{ 0x00000020807c4040ull,  67281 },
	{ 0x00000041018700c0ull,  79076 },
	{ 0x0010000080fc4080ull,  17115 },
	{ 0x1000003c80180030ull,  50718 },
	{ 0x2006001cf00c0018ull,  24659 },
	{ 0xffffffbfeff80fdcull,  38291 },
	{ 0x000000101003f812ull,  30605 },
	{ 0x0800001f40808200ull,  37759 },
	{ 0x084000101f3fd208ull,   4639 },
	{ 0x080000000f808081ull,  21759 },
	{ 0x0004000008003f80ull,  67799 },
	{ 0x08000001001fe040ull,  22841 },
	{ 0x085f7d8000200a00ull,  66689 },
	{ 0xfffffeffbfeff81dull,  62548 },
	{ 0xffbfffefefdff70full,  66597 },
	{ 0x100000101ec10082ull,  86749 },
	{ 0x7fbaffffefe0c02full,  69558 },
	{ 0x7f83fffffff07f7full,  61589 },
	{ 0xfff1fffffff7ffc1ull,  62533 },
	{ 0x0878040000ffe01full,  64387 },
	{ 0x005d00000120200aull,  26581 },
	{ 0x0840800080200fdaull,  76355 },
	{ 0x100000c05f582008ull,  11140 }
},
rook_magics[64] =
{
	{ 0x80280013ff84ffffull,  10890 },
	{ 0x5ffbfefdfef67fffull,  56054 },
	{ 0xffeffaffeffdffffull,  67495 },
	{ 0x003000900300008aull,  72797 },
	{ 0x0030018003500030ull,  17179 },
	{ 0x0020012120a00020ull,  63978 },
	{ 0x0030006000c00030ull,  56650 },
	{ 0xffa8008dff09fff8ull,  15929 },
	{ 0x7fbff7fbfbeafffcull,  55905 },
	{ 0x0000140081050002ull,  26301 },
	{ 0x0000180043800048ull,  78100 },
	{ 0x7fffe800021fffb8ull,  86245 },
	{ 0xffffcffe7fcfffafull,  75228 },
	{ 0x00001800c0180060ull,  31661 },
	{ 0xffffe7ff8fbfffe8ull,  38053 },
	{ 0x0000180030620018ull,  37433 },
	{ 0x00300018010c0003ull,  74747 },
	{ 0x0003000c0085ffffull,  53847 },
	{ 0xfffdfff7fbfefff7ull,  70952 },
	{ 0x7fc1ffdffc001fffull,  49447 },
	{ 0xfffeffdffdffdfffull,  62629 },
	{ 0x7c108007befff81full,  58996 },
	{ 0x20408007bfe00810ull,  36009 },
	{ 0x0400800558604100ull,  21230 },
	{ 0x0040200010080008ull,  51882 },
	{ 0x0010020008040004ull,  11841 },
	{ 0xfffdfefff7fbfff7ull,  25794 },
	{ 0xfebf7dfff8fefff9ull,  49689 },
	{ 0xc00000ffe001ffe0ull,  63400 },
	{ 0x2008208007004007ull,  33958 },
	{ 0xbffbfafffb683f7full,  21991 },
	{ 0x0807f67ffa102040ull,  45618 },
	{ 0x200008e800300030ull,  70134 },
	{ 0x0000008780180018ull,  75944 },
	{ 0x0000010300180018ull,  68392 },
	{ 0x4000008180180018ull,  66472 },
	{ 0x008080310005fffaull,  23236 },
	{ 0x4000188100060006ull,  19067 },
	{ 0xffffff7fffbfbfffull,      0 },
	{ 0x0000802000200040ull,  43566 },
	{ 0x20000202ec002800ull,  29810 },
	{ 0xfffff9ff7cfff3ffull,  65558 },
	{ 0x000000404b801800ull,  77684 },
	{ 0x2000002fe03fd000ull,  73350 },
	{ 0xffffff6ffe7fcffdull,  61765 },
	{ 0xbff7efffbfc00fffull,  49282 },
	{ 0x000000100800a804ull,  78840 },
	{ 0xfffbffefa7ffa7feull,  82904 },
	{ 0x0000052800140028ull,  24594 },
	{ 0x00000085008a0014ull,   9513 },
	{ 0x8000002b00408028ull,  29012 },
	{ 0x4000002040790028ull,  27684 },
	{ 0x7800002010288028ull,  27901 },
	{ 0x0000001800e08018ull,  61477 },
	{ 0x1890000810580050ull,  25719 },
	{ 0x2003d80000500028ull,  50020 },
	{ 0xfffff37eefefdfbeull,  41547 },
	{ 0x40000280090013c1ull,   4750 },
	{ 0xbf7ffeffbffaf71full,   6014 },
	{ 0xfffdffff777b7d6eull,  41529 },
	{ 0xeeffffeff0080bfeull,  84192 },
	{ 0xafe0000fff780402ull,  33433 },
	{ 0xee73fffbffbb77feull,   8555 },
	{ 0x0002000308482882ull,   1009 }
};
