-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchange_board.cpp
57 lines (47 loc) · 1.7 KB
/
change_board.cpp
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
#include "change_board.h"
#include "hash.h"
ull flip(int pos, ull me, ull op){
ull flipped, outflank, mask;
ull ret = 0ULL;
mask = 0x0080808080808080ULL >> (63 - pos);
outflank = (0x8000000000000000ULL >> __builtin_clzll(~op & mask)) & me;
flipped = (-outflank * 2) & mask;
mask = 0x0101010101010100ULL << pos;
outflank = mask & ((op | ~mask) + 1) & me;
flipped |= (outflank - (outflank != 0)) & mask;
ret |= flipped;
op &= 0x7e7e7e7e7e7e7e7eULL;
mask = 0x7f00000000000000ULL >> (63 - pos);
outflank = (0x8000000000000000ULL >> __builtin_clzll(~op & mask)) & me;
flipped = (-outflank * 2) & mask;
mask = 0x00000000000000feULL << pos;
outflank = mask & ((op | ~mask) + 1) & me;
flipped |= (outflank - (outflank != 0)) & mask;
ret |= flipped;
mask = 0x0102040810204000ULL >> (63 - pos);
outflank = (0x8000000000000000ULL >> __builtin_clzll(~op & mask)) & me;
flipped = (-outflank * 2) & mask;
mask = 0x0002040810204080ULL << pos;
outflank = mask & ((op | ~mask) + 1) & me;
flipped |= (outflank - (outflank != 0)) & mask;
ret |= flipped;
mask = 0x0040201008040201ULL >> (63 - pos);
outflank = (0x8000000000000000ULL >> __builtin_clzll(~op & mask)) & me;
flipped = (-outflank * 2) & mask;
mask = 0x8040201008040200ULL << pos;
outflank = mask & ((op | ~mask) + 1) & me;
flipped |= (outflank - (outflank != 0)) & mask;
ret |= flipped;
return ret;
}
bool unhash_change_board(ull& me, ull& op, int z){
#ifdef DEBUG
unhash_change_board_counter++;
#endif
ull f = flip(z,me,op);
if(!f) return false;
me |= (1ULL<<z);
op &= ~f;
me |= f;
return true;
}