stellar

UCI Chess engine written in C++20
git clone git://git.dimitrijedobrota.com/stellar.git
Log | Files | Refs | README | LICENSE

bit.hpp (1174B)


0 #ifndef STELLAR_BIT_H
1 #define STELLAR_BIT_H
3 #include "utils.hpp"
5 namespace bit {
7 inline constexpr bool get(const U64 &bitboard, uint8_t square) { return (bitboard >> (square)) & C64(1); }
8 inline constexpr void set(U64 &bitboard, uint8_t square) { bitboard |= (C64(1) << square); }
9 inline constexpr void pop(U64 &bitboard, uint8_t square) { bitboard &= ~(C64(1) << (square)); }
11 inline constexpr uint8_t count(U64 bitboard) {
12 #if __has_builtin(__builtin_popcountll)
13 return __builtin_popcountll(bitboard);
14 #else
15 int count = 0;
16 for (; bitboard > 0; bitboard &= bitboard - 1)
17 count++;
18 return count;
19 #endif
20 }
22 inline constexpr uint8_t lsb_index(U64 bitboard) {
23 #if __has_builtin(__builtin_ffsll)
24 return __builtin_ffsll(bitboard) - 1;
25 #else
26 if (!bitboard) return -1;
27 return bit_count((bitboard & -bitboard) - 1);
28 #endif
29 }
31 inline constexpr U64 &lsb_pop(U64 &bitboard) { return bitboard &= bitboard & (bitboard - 1); }
33 #define bitboard_for_each_bit(var, bb) \
34 for (var = bit::lsb_index(bb); bb; bit::lsb_pop(bb), var = bit::lsb_index(bb))
36 } // namespace bit
38 #endif