}
}
-/// lsb()/msb() finds the least/most significant bit in a nonzero bitboard.
-/// pop_lsb() finds and clears the least significant bit in a nonzero bitboard.
+/// lsb()/msb() finds the least/most significant bit in a non-zero bitboard.
+/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard.
#ifndef USE_BSFQ
void Bitboards::init() {
- for (int k = 0, i = 0; i < 8; ++i)
- while (k < (2 << i))
- MS1BTable[k++] = i;
-
- for (int i = 0; i < 64; ++i)
- BSFTable[bsf_index(1ULL << i)] = Square(i);
-
for (Square s = SQ_A1; s <= SQ_H8; ++s)
- SquareBB[s] = 1ULL << s;
+ BSFTable[bsf_index(SquareBB[s] = 1ULL << s)] = s;
+
+ for (Bitboard b = 1; b < 256; ++b)
+ MS1BTable[b] = more_than_one(b) ? MS1BTable[b - 1] : lsb(b);
FileBB[FILE_A] = FileABB;
RankBB[RANK_1] = Rank1BB;
for (Color c = WHITE; c <= BLACK; ++c)
for (PieceType pt = PAWN; pt <= KING; ++pt)
for (Square s = SQ_A1; s <= SQ_H8; ++s)
- for (int k = 0; steps[pt][k]; ++k)
+ for (int i = 0; steps[pt][i]; ++i)
{
- Square to = s + Square(c == WHITE ? steps[pt][k] : -steps[pt][k]);
+ Square to = s + Square(c == WHITE ? steps[pt][i] : -steps[pt][i]);
if (is_ok(to) && square_distance(s, to) < 3)
StepAttacksBB[make_piece(c, pt)][s] |= to;
Bitboard pick_random(RKISS& rk, int booster) {
// Values s1 and s2 are used to rotate the candidate magic of a
- // quantity known to be the optimal to quickly find the magics.
+ // quantity known to be optimal to quickly find the magics.
int s1 = booster & 63, s2 = (booster >> 6) & 63;
Bitboard m = rk.rand<Bitboard>();