Being more of a pure C guy, I had forgotten about bitset. That will make your life easier.
Just to make sure I and everyone understand then:
Small problem: this is a set of 15 bits, indexed 0-14. You want a set of 16 bits, indexed 0-15. Now what is the purpose here:
bitset<15> bits; // holds the symbol type
You don't have to do that, the bits are initialized to zero (not sure what your purpose is...)
Anyway, so I am guessing by "holds the symbol type" you mean this indicates whether this position has an X or an O. Which doesn't deal with empty, so:
Is the purpose of that (again, it should be 16) to indicate whether a square is occupied or not?
bitset<15> bp; // holds board position