X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmove.h;h=527699c82f8cf73b6ef9078c06abcf94f0b23ecf;hb=6176357ac18dcc2f0dd12c17d5ac654c86a32009;hp=56659cd983a0fdc93a7b9d40c16e1c1f2c602534;hpb=539051b1e0fb099c0d0da69d20d6a4c2b98a2cb6;p=stockfish diff --git a/src/move.h b/src/move.h index 56659cd9..527699c8 100644 --- a/src/move.h +++ b/src/move.h @@ -38,10 +38,22 @@ class Position; +/// A move needs 17 bits to be stored +/// +/// bit 0- 5: destination square (from 0 to 63) +/// bit 6-11: origin square (from 0 to 63) +/// bit 12-14: promotion piece type +/// bit 15: en passant flag +/// bit 16: castle flag +/// +/// Special cases are MOVE_NONE and MOVE_NULL. We can sneak these in +/// because in any normal move destination square is always different +/// from origin square while MOVE_NONE and MOVE_NULL have the same +/// origin and destination square, 0 and 1 respectively. + enum Move { MOVE_NONE = 0, - MOVE_NULL = 65, - MOVE_MAX = 0xFFFFFF + MOVE_NULL = 65 }; @@ -50,17 +62,20 @@ struct MoveStack { int score; }; +// Note that operator< is set up such that std::sort() will sort in descending order +inline bool operator<(const MoveStack& f, const MoveStack& s) { return s.score < f.score; } + //// //// Inline functions //// inline Square move_from(Move m) { - return Square((int(m) >> 6) & 077); + return Square((int(m) >> 6) & 0x3F); } inline Square move_to(Move m) { - return Square(m & 077); + return Square(m & 0x3F); } inline PieceType move_promotion(Move m) {