I did that for room flags in mine and it's a fairly simple process. A bitset is, in an overly simplified way of speaking, an array of bools. And they come with some handy little built in functions for manipulating elements in them.
These are the changes I made to mud.h.
using std::bitset; <-- put this up at the top.
It's not really necessary but it means you can just do what I did in room_index_data, as shown below, as apposed to typing std::bitset everywhere.
bitset < MAX_ROOM_FLAGS > room_flags; <-- notice there's no std:: before bitset thanks to the using directive
I also made copies of the (x)IS_SET/IS_EMPTY/TOGGLE_BIT/CLEAR_BITS macros like so:
#define xIS_SETx( var, bit ) ( (var).test( (bit) ) )
#define xIS_EMPTYx(var) ( (var).any() )
#define xTOGGLE_BITx(var, bit) ( (var).flip( (bit) ) )
#define xCLEAR_BITSx(var) ( (var).reset() )
These are mostly for the sake of ease of converting everything else from bitvectors/ext_bv's over to the bitsets. A global search and replace of IS_SET and xIS_SET to xIS_SETx is much easier than trying to go in and replace all the calls to the old macros from (x)IS_SET( var, bit ) to var.test( bit ).
Then it's simply a matter of converting all the things that use bitvectors to bitsets, and that's mostly an issue with deciding how to save and load the stuff, at least for me. I ended up just saving room flags in the same spot they were already being saved at in area files, except it's a long string of a lot of 0's and a few 1's. Not exactly the prettiest of things. I also threw a function template, courtesy of Samson, at the bottom which allows me Would be much nicer if I converted to the key'd area file format but I was mostly interested in getting it working than making it look pretty then.
Damn, now I have to do that. I hope you people are proud of yourselves!
Anywho, check here
to get a more in-depth idea of how bitsets work.
the topic I'd made when I needed an assist while doing the room flags conversion. You might find something in there of some use.