/// whether a given bit is set in a bitboard, and for setting and clearing bits.
inline Bitboard operator&(Bitboard b, Square s) {
+ assert(s >= SQ_A1 && s <= SQ_H8);
return b & SquareBB[s];
}
inline Bitboard operator|(Bitboard b, Square s) {
+ assert(s >= SQ_A1 && s <= SQ_H8);
return b | SquareBB[s];
}
inline Bitboard operator^(Bitboard b, Square s) {
+ assert(s >= SQ_A1 && s <= SQ_H8);
return b ^ SquareBB[s];
}
inline Bitboard& operator|=(Bitboard& b, Square s) {
+ assert(s >= SQ_A1 && s <= SQ_H8);
return b |= SquareBB[s];
}
inline Bitboard& operator^=(Bitboard& b, Square s) {
+ assert(s >= SQ_A1 && s <= SQ_H8);
return b ^= SquareBB[s];
}
enum { Unopposed, BlockedByPawn, Unblocked };
constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
- constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH);
- constexpr Bitboard BlockRanks = (Us == WHITE ? Rank2BB | Rank3BB : Rank7BB | Rank6BB);
+ constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH);
+ constexpr Bitboard BlockRanks = (Us == WHITE ? Rank1BB | Rank2BB : Rank8BB | Rank7BB);
Bitboard b = pos.pieces(PAWN) & (forward_ranks_bb(Us, ksq) | rank_bb(ksq));
Bitboard ourPawns = b & pos.pieces(Us);
Value safety = (ourPawns & file_bb(ksq)) ? Value(5) : Value(-5);
- if ((theirPawns & (FileABB | FileHBB) & BlockRanks) & (ksq + Up))
+ if ((shift<Down>(theirPawns) & (FileABB | FileHBB) & BlockRanks) & ksq)
safety += 374;
File center = std::max(FILE_B, std::min(FILE_G, file_of(ksq)));