Skip to content

Commit

Permalink
Add lsb() overload
Browse files Browse the repository at this point in the history
Helper to find least significant bit relative to
the given color.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
  • Loading branch information
glinscott authored and mcostalba committed Aug 28, 2013
1 parent e6482b7 commit aecdbfc
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 17 deletions.
5 changes: 5 additions & 0 deletions src/bitboard.h
Expand Up @@ -319,4 +319,9 @@ extern Square pop_lsb(Bitboard* b);

#endif

/// lsb() overload finds least significant bit relative to the given color
inline Square lsb(Color c, Bitboard b) {
return c == WHITE ? lsb(b) : msb(b);
}

#endif // #ifndef BITBOARD_H_INCLUDED
18 changes: 3 additions & 15 deletions src/endgame.cpp
Expand Up @@ -443,18 +443,7 @@ ScaleFactor Endgame<KBPsK>::operator()(const Position& pos) const {
// The bishop has the wrong color, and the defending king is on the
// file of the pawn(s) or the adjacent file. Find the rank of the
// frontmost pawn.
Rank rank;
if (strongerSide == WHITE)
{
for (rank = RANK_7; !(rank_bb(rank) & pawns); rank--) {}
assert(rank >= RANK_2 && rank <= RANK_7);
}
else
{
for (rank = RANK_2; !(rank_bb(rank) & pawns); rank++) {}
rank = Rank(rank ^ 7); // HACK to get the relative rank
assert(rank >= RANK_2 && rank <= RANK_7);
}
Rank rank = relative_rank(strongerSide, lsb(weakerSide, pawns));
// If the defending king has distance 1 to the promotion square or
// is placed somewhere in front of the pawn, it's a draw.
if ( square_distance(kingSq, queeningSq) <= 1
Expand All @@ -469,9 +458,8 @@ ScaleFactor Endgame<KBPsK>::operator()(const Position& pos) const {
&& pos.non_pawn_material(weakerSide) == 0
&& pos.count<PAWN>(weakerSide) >= 1)
{
// Get weaker pawn closest to opponent's queening square
Bitboard wkPawns = pos.pieces(weakerSide, PAWN);
Square weakerPawnSq = strongerSide == WHITE ? msb(wkPawns) : lsb(wkPawns);
// Get weakerSide pawn that is closest to home rank
Square weakerPawnSq = lsb(weakerSide, pos.pieces(weakerSide, PAWN));

Square strongerKingSq = pos.king_square(strongerSide);
Square weakerKingSq = pos.king_square(weakerSide);
Expand Down
4 changes: 2 additions & 2 deletions src/pawns.cpp
Expand Up @@ -229,11 +229,11 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
for (int f = kf - 1; f <= kf + 1; f++)
{
b = ourPawns & FileBB[f];
rkUs = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1;
rkUs = b ? relative_rank(Us, lsb(Us, b)) : RANK_1;
safety -= ShelterWeakness[rkUs];

b = theirPawns & FileBB[f];
rkThem = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1;
rkThem = b ? relative_rank(Us, lsb(Us, b)) : RANK_1;
safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem];
}

Expand Down

0 comments on commit aecdbfc

Please sign in to comment.