54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
#include "BitBoard.h"
|
|
|
|
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::getRank(int r) {
|
|
return (genShift(1ULL, (r + 1) * 8) - 1) & genShift(~1ULL, r * 8 - 1);
|
|
}
|
|
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();
|
|
}
|