I’m a bit concerned with the bitboard representation. What happens when a pawn takes another piece?
Edit: The above is what I would say if someone presented this approach in an interview.
I'd like to see the rest of this implemented. What does this global functions look like? Are they swamped with if statements "I hope not" or are you storing some game logic in structs to replace polymorphism. I don't disagree with with the compact pawn struct as a starting point but to further prove your point I would love to see the rest / pseudo code.
stockfish is an open source chess engine that uses BitBoards https://github.com/official-stockfish/Stockfish/