Napiszę dzisiaj o nierzadko zapominanej klasie z biblioteki standardowej C++, czyli o tytułowym zbiorze bitów – std::bitset
. Działania na pojedynczych bitach nie są raczej czymś, co wykonujemy codziennie, ale zdarzają się sytuacje, gdy stanowią one najrozsądniejsze rozwiązanie w danej chwili. Takim typowym przypadkiem jest zbiór flag logicznych: kilku opcji działających jak przełączniki, których możliwą wartością jest tylko true
albo false
. Wszelkie API doskonale zna takie konstrukcje, czego przykładem może być metoda Clear
urządzenia DirectX:
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER
jest właśnie kombinacją flag bitowych, a dwie występujące tu stałe zostały odpowiednio zdefiniowane, by dało się je łączyć operatorem sumy bitowej |
.
Używając std::bitset
możemy nieco uprościć obsługę takich opcji. Zamiast deklarowania specjalnych wartości, możemy użyć zwykłego enum
a, np.:
bitset
jest wtedy łatwy w użyciu:
Zachowana jest przy tym “kompatybilność wsteczna” w stosunku do ręcznie definiowanych stałych, jeśli chcielibyśmy z nich korzystać:
Na koniec wspomnę tylko, że aby korzystać z klasy bitset
do tych lub innych zastosowań, należy wpierw dołączyć standardowy nagłówek o nazwie… bitset :)
Zastanawia mnie tylko wydajność takiego rozwiązania w porównaniu z ręcznym ustawianiem flag ;P…
czyli przewaga tego na zwykłym ulongiem jest taka, że mamy dodatkową składnię ( operator[] ) i nie trzeba dopisywać kolejnych potęg dwójki do enuma? Bo jeśli tak, to moim zdaniem niewarte świeczki.
Jeśli chodzi o zastosowanie bitset do flag bitowych to hmm… zdaje się, że właśnie tak. Na szczęście ma on jeszcze kilka innych ciekawych, o których pewnie za jakiś czas napiszę :)
Fakt jest to wygodne, ale mi np. ciężko będzie się do jego użytkowania przekonać. Operacje na bitach wyglądają lepiej w kodzie :P