Flagi bitowe, czyli jak przechować wiele opcji w jednej wartości liczbowej

flagZa sprawą obiektowych języków programowania wykorzystywanie flag bitowych stało się mniej popularne. Warto jednak wiedzieć, że jest coś takiego i w jaki sposób można je zaimplementować we własnych projektach.

W największym uproszczeniu:

Flagi bitowe wykorzystuje się do zapisu wielu informacji typu tak/nie pod postacią jednej liczby naturalnej.

Załóżmy, że posiadamy w projekcie zestaw praw dostępu:

  • CREATE – utworzenie podmiotu
  • EDIT_OWN – edycja własnych podmiotów
  • EDIT_ALL – edycja wszystkich podmiotów
  • VIEW_OWN – podgląd własnych podmiotów
  • VIEW_ALL – podgląd wszystkich podmiotów
  • DELETE_OWN – usunięcie własnych podmiotów
  • DELETE_ALL – usunięcie wszystkich podmiotów

Najprostrzym rozwiązaniem byłoby stworzenie obiektu składającego się z tych siedmiu opcji logicznych typu boolean. Czyli do przechowania wszystkich opcji należałoby przeznaczyć siedem bajtów. Za pomocą flag bitowych można zmniejszyć wykorzystanie pamięci w tym przypadku do tylko czterech bajtów wykorzystując zmienną liczbową typu int. Wykorzystując typ short czy byte rozmiar mógłby być odpowiednio zmniejszony do dwóch lub jednego bajtu. To co nas ogranicza, to ilość flag możliwych do zakodowania w odpowiednim typie:

  • byte: 8 flag.
  • short: 16 flag
  • int: 32 flagi
  • long: 64 flagi

Jak to wygląda w praktyce?

Wyobraźmy sobie nasz zestaw parametrów typu tak/nie jako ciąg zer i jedynek, czyli liczby binarnej. Parametrów jest siedem, tak więc ilość zer i jedynek będzie wynosiła siedem. Przejdźmy do zakodowania opcji:

  1. 0000001: CREATE, dziesiętnie: 1
  2. 0000010: EDIT_OWN, dziesiętnie: 2
  3. 0000100: EDIT_ALL, dziesiętnie: 4
  4. 0001000: VIEW_OWN, dziesiętnie: 8
  5. 0010000: VIEW_ALL, dziesiętnie: 16
  6. 0100000: DELETE_OWN, dziesiętnie: 32
  7. 1000000: DELETE_ALL, dziesiętnie: 64

Już można się domyślić, że ustawienie odpowiednich praw dostępu będzie się wiązało z ustawieniem jedynek (flag) na odpowiednich miejscach liczby binarnej.

Na przykład, zestaw praw dostępu z ustawionymi opcjami CREATE, EDIT_ALL i DELETE_ALL będzie miał postać binarną:

1000101

Powyższa liczba w postaci dziesiętnej ma wartość: 69. Wszystkie uprawnienia zostały zakodowane w jednej liczbie naturalnej. Banalnie proste!

Implementacja w Javie

Tworzę klasę zawierającą w zmiennych statycznych kolejne flagi bitowe dla każdej z operacji. W zmiennej rights przechowywany będzie aktualny stan uprawnień.

Ustawianie flag (uprawnień)

Wykonuje się przez operacją OR na każdym bicie. Np.

Metoda ustawiająca flagi:

Przykład użycia:

Po wywołaniu metody zostaną nadane uprawnienia do operacji: EDIT_OWN, VIEW_OWN i DELETE_OWN.

 

Weryfikacja ustawienia flag (uprawnień)

Metoda sprawdzająca czy odpowiednie flagi są ustawione (czy są uprawnienia do wszystkich operacji). Tym razem z wykorzystaniem operatora AND

 

Przykład użycia:

Powyższa metoda zwróci wartość logiczną informującą, czy ustawione są oba prawa EDIT_OWN i EDIT_ALL.

Usuwanie flag (uprawnień)

Odbywa się przez operację XOR‚owania:

Przykład użycia:

Powyższy kod usunie flagi do operacji: DELETE_OWN i CREATE

 

Kompletna klasa:

Wynik:

 

To również może Cię zainteresować:

  • Koniec ery PascalaKoniec ery Pascala To się musiało kiedyś wydarzyć - Pascal odchodzi w zapomnienie. Od przyszłego roku w szkołach średnich zastąpi go... PYTHON! W komunikacie dyrektora Centralnej Komisji Egzaminacyjnej z […]
  • Dlaczego kwadrat nie jest prostokątem?Dlaczego kwadrat nie jest prostokątem? Z punktu widzenia matematyka tak. Z punktu widzenia programisty jednak w żadnym wypadku nie powinien. Główne zasady programowania obiektowego zdefiniowane przez Roberta C. Martina […]
  • Linkedin – czyli co w trawie piszczy i skąd wiatr wiejeLinkedin – czyli co w trawie piszczy i skąd wiatr wieje Linkedin, Goldenline, a w ostatnim czasie dedykowane grupy na Facebooku. To główne źródła gdzie można znaleźć najnowsze oferty pracy. Pojawia się ich mnóstwo. W dzisiejszych czasach […]
  • Arduino – flagi bitoweArduino – flagi bitowe Pamiętacie jak miesiąc temu wspominałem o flagach bitowych w javie? Arduino jest właśnie świetnym przykładem możliwości ich wykorzystania. Mamy tutaj ograniczoną pamięć, dlatego w prosty […]
  • Muzycznie, nieprogramistycznie – BesidesMuzycznie, nieprogramistycznie – Besides Miałem okazję być ostatnio na tak bardzo kameralnym koncercie zespołu Besides, jak bardzo może się to wydać nierealne. Świetny klimat, wspaniała muzyka i do tego tak skromni […]
  • Raspberry PI 2, nauka podstaw Pythona 3Raspberry PI 2, nauka podstaw Pythona 3 W jednym z ostatnich wpisów zebrałem sobie źródła wiedzy do nauki Pythona, a w międzyczasie kupiłem Raspberry PI 2. Jedno z drugim jest mocno powiązane, ponieważ minikomputer standardowo […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *