stellarUCI Chess engine written in C++20 |
git clone git://git.dimitrijedobrota.com/stellar.git |
Log | Files | Refs | README | LICENSE | |
bit.hpp (1174B)
1 #ifndef STELLAR_BIT_H 2 #define STELLAR_BIT_H 3 4 #include "utils.hpp" 5 6 namespace bit { 7 8 inline constexpr bool get(const U64 &bitboard, uint8_t square) { return (bitboard >> (square)) & C64(1); } 9 inline constexpr void set(U64 &bitboard, uint8_t square) { bitboard |= (C64(1) << square); } 10 inline constexpr void pop(U64 &bitboard, uint8_t square) { bitboard &= ~(C64(1) << (square)); } 11 12 inline constexpr uint8_t count(U64 bitboard) { 13 #if __has_builtin(__builtin_popcountll) 14 return __builtin_popcountll(bitboard); 15 #else 16 int count = 0; 17 for (; bitboard > 0; bitboard &= bitboard - 1) 18 count++; 19 return count; 20 #endif 21 } 22 23 inline constexpr uint8_t lsb_index(U64 bitboard) { 24 #if __has_builtin(__builtin_ffsll) 25 return __builtin_ffsll(bitboard) - 1; 26 #else 27 if (!bitboard) return -1; 28 return bit_count((bitboard & -bitboard) - 1); 29 #endif 30 } 31 32 inline constexpr U64 &lsb_pop(U64 &bitboard) { return bitboard &= bitboard & (bitboard - 1); } 33 34 #define bitboard_for_each_bit(var, bb) \ 35 for (var = bit::lsb_index(bb); bb; bit::lsb_pop(bb), var = bit::lsb_index(bb)) 36 37 } // namespace bit 38 39 #endif