Witam. Na pewno nie raz zdarzyło Ci się korzystać z flag bitowych – podczas używania strumieni, tworzenia okna w WinAPI itp. Są one przydatne, gdy chcemy przekazać jakiejś funkcji informacje na temat preferowanych przez nas ustawień:

mainJak widać, ustawiamy dwie flagi: ios::in i ios::binary, co oznacza, że plik ma być otwarty do czytania w trybie binarnym. Wygodne, prawda? W jednym parametrze przesłaliśmy nasze wymagania co do tworzonego strumienia. Możemy samemu tworzyć podobne flagi i wykorzystywać je we własnych programach, gdyż nie jest to nic trudnego.

Cóż to te flagi?

Spójrzmy na flagi, które wykorzystujemy podczas tworzenia strumieni:

Jak widać, flagi są kolejnymi elementami typu wyliczeniowego z przypisanymi specyficznymi wartościami, które zapisane są w systemie heksadecymalnym (szesnastkowym). Flagi są zwykle poszczególnymi bitami w słowie long. Za pomocą operatora sumy bitowej | ustawiamy odpowiednie flagi w naszej zmiennej:

Na ekran zostanie wypisane 3 – taka jest wartość naszej zmiennej po ustawieniu pierwszej i drugiej flagi. Pewnie zadasz pytanie: ale jak teraz sprawdzić, które flagi zostały ustawione? Dobre pytanie ;]

Pamiętaj jednak, aby nadawać flagom jedynie wartości kolejnych potęg dwójki. Jest to bardzo ważne! Prześledźmy teraz, jak 'działają’ nasze flagi bitowe.

W systemie binarnym (dwójkowym) wartości flaga1, flaga2 i flaga3 przedstawiają się następująco:

flaga1 00000001
flaga2 00000010
flaga3 00000100

Na początku nasza zmienna test ma wartość 0, ale po wykonaniu intrukcji test = flaga1 | flaga2 ; ustawione zostaną w niej te bity, które są ustawione w flaga1 lub flaga2:

 

flaga1 00000001
flaga2 00000010
test 00000011

Dzięki temu, że nasze flagi są wartościami kolejnych potęg dwójki, każda flaga ma w swoim zapisie binarny ustawiony tylko jeden bit na 1, pozostałe 0. Dzięki temu możemy sprawdzić, czy dana flaga została ustawiona, czy nie, tak jak to wcześniej pokazałem za pomocą operatora iloczynu bitowego &:

 

flaga1 00000001
test 00000001

Jeżeli oba odpowiadające sobie bity są ustawione, to znaczy, że dana flaga (w tym przypadku flaga1) jest ustawiona w zmiennej (test). Oba najmniej znaczące bity są ustawione, więc na ekranie pojawi się komunikat.

Jeżeli jednak wartość flagi byłaby różna od jednej z potęgo dwójki, to mielibyśmy niechciany efekt:

Pytanie: czy zobaczymy komunikat? Oczywiście tak, gdyż zapis binarny trójki prezentuje się następująco: 00000011, więc porównując kolejne bity wyjdzie na to, że flaga1 jest ustawiona, poza tym ustawiona jest też flaga2 i flaga3..w tym momencie praca na flagach jest niemożliwa.

Wracając do korzystania z flag: jak widać, za pomocą operatora iloczynu bitowego sprawdzamy, czy dana flaga została ustawiona. Możemy też pójść dalej:

Jeżeli chcielibyśmy skasować wszelkie flagi, do zmiennej należałoby przypisać 0:

Natomiast, usunięcie jednej lub kilku flag wykonuje się w następujący sposób:

Przypomnę tylko, że powyższy przykład jest równoważny poniższemu:

Czas na mały przykład – bardzo prosta baza danych. Flagi wykorzystujemy do tego, żeby ustalić, które dane mają być wyświetlone. Nie jest to zrobione 'superekstra’, to tylko prosty przykład:

Autor: Iskar