no i co z tego, że to_ulong zwraca 32 (albo nawet 64) bity!
to jest szablon, którego parametrem jest liczba bitów. Wygląda na to (tak wykazuje twój kod), że ty zawsze potrzebujesz 16 bitów (lub maksymalnie), więc zastosowanie bitset<16> aż się prosi. Nadmiarowe bity z to_ulong i tak zostaną odrzucone, naprawdę nie masz się co tym przejmować, a zysk będzie z 16 krotny lub większy.
Nawet jeśli się upierasz na vector, to przecież wyraźnie napisałem, że vector<bool> przechowuje dane w bitach, więc twoja konwersja jest stratą czasu, bo dokonujesz skomplikowanej konwersji po miedzy dwoma obiektami, które w pamięci niczym się nie różnią.
Problemem jest jedynie efektywne wydłubanie tego z vector-a (dlatego zalecam bitset bo tam masz to podane na tacy).