#include "BitBoard.hpp" BitBoard::BitBoard(uint64_t v) { mBoard = v; } std::ostream &operator<<(std::ostream &os, const BitBoard &board) { // For debugging only, performance isn't important for (int i = 7; i >= 0; i--) { int rank = i * 8; for (int j = 0; j < 8; j++) { // Get the piece for this index. Assume it exists. // Print piece, otherwise '.'; if (board.mBoard & (1ULL << (rank + j))) { os << 1; } else { os << '.'; } os << ' '; } os << '\n'; } return os; } BitBoard BitBoard::genShift(BitBoard x, const int s) { return (s < 0) ? (x >> -s) : (s > 63) ? x : (x << s); } BitBoard BitBoard::northFill() const { BitBoard result(mBoard); result |= (result << 8); result |= (result << 16); result |= (result << 32); return (result << 8); } BitBoard BitBoard::southFill() const { BitBoard result(mBoard); result |= (result >> 8); result |= (result >> 16); result |= (result >> 32); return result; } BitBoard BitBoard::fileFill() const { return northFill() | southFill(); } BitBoard BitBoard::kingAttacks(const BitBoard bb) { BitBoard result = bb.east() | bb.west() | bb; result |= (result.north() | result.south()); result ^= bb; return result; } BitBoard BitBoard::bishopAttacks(BitBoard bishops, BitBoard empty) { BitBoard result = 0; BitBoard diag1 = bishops; BitBoard diag2 = bishops; empty ^= bishops; for (int i = 0; i < 7; i++) { result |= (diag1 | diag2); diag1 = (diag1.northWest() | diag1.southEast()) & empty; diag2 = (diag2.northEast() | diag2.southWest()) & empty; } return (result | diag1.northWest() | diag1.southEast() | diag2.northEast() | diag2.southWest()) & ~bishops; } BitBoard BitBoard::pawnNorthAttacks(BitBoard pawns, BitBoard targets) { return (pawns.northEast() | pawns.northWest()) & targets; } BitBoard BitBoard::pawnNorthMoves(BitBoard pawns, BitBoard empty) { pawns = pawns.north() & empty; return (pawns | (pawns.north() & Rank4)) & empty; } BitBoard BitBoard::pawnSouthAttacks(BitBoard pawns, BitBoard targets) { return (pawns.southEast() | pawns.southWest()) & targets; } BitBoard BitBoard::pawnSouthMoves(BitBoard pawns, BitBoard empty) { pawns = pawns.south() & empty; return (pawns | (pawns.south() & Rank5)) & empty; }