Flagi binarne
Załóżmy że mamy kwadratowe komórki labiryntu. Każda ściana każdej komórki może mieć dwa stany: ściana jest – brak
ściany. Ponieważ ścian mamy 4 istnieje sporo możliwych układów. Powstaje pytanie jak najprościej opisać stan
pojedynczej komórki labiryntu?
Oznaczmy nasze ściany:
a = 1; //górna
b = 2; //prawa
c = 4; //dolna
d = 8; //lewa
nFlag = a + b + c + d = 1 + 2 + 4 + 8 = 15;
Binarnie jest to liczba (1111)2
Wyłączenie bitu
Aby wyłączyć opcję d = 8 użyjemy zaprzeczenia binarnego:
nFlag & = ~d;
Otrzymamy (7)10= (0111)2. Czwarty bit od prawej został wyłączony.
Włączenie bitu
Aby włączyć bit d użyjemy alternatywy binarnej:
nFlag |= d;
Otrzymujemy (15)10, czyli (1111)2.
Przełączenie bitu
Jeśli chcemy zburzyć ścianę b użyjemy operatora bitowego różnicy symetrycznej (xor):
nFlag ^= b;
Otrzymamy (13)10, czyli (1101)2. Druga jedynka od prawej zamieniła się w 0. gdyby było tam zero – zostałoby zamienione przez jedynkę.
Budowa ściany labiryntu
Chcemy mieć komórkę mającą ścianę prawą, dolną i lewą:
int cell = b | c | d;
Otrzymujemy (14)10, czyli (1110)2
Teraz jeszcze jedna komórka mającą tylko ścianę lewą i prawą:
int cell1 = b | d;
Otrzymujemy (10)10, czyli (1010)2
Sprawdzenie czy ściana stoi
int optd = (cell1 & d) == d ? 1 : 0;
Otrzymujemy: 1 – ściana stoi.
Klasa BinAria10.java
int a = 1; int b = 2; int c = 4; int d = 8; int nFlag = a + b + c + d; System.out.println(nFlag); System.out.println(Integer.toBinaryString(nFlag)); //- nFlag &= ~d; System.out.println(nFlag); System.out.println(Integer.toBinaryString(nFlag)); //- nFlag |= d; System.out.println(nFlag); System.out.println(Integer.toBinaryString(nFlag)); //- nFlag ^= b; System.out.println(nFlag); System.out.println(Integer.toBinaryString(nFlag)); //- int cell = b | c | d; System.out.println(cell); System.out.println(Integer.toBinaryString(cell)); //- int cell1 = b | d; System.out.println(cell1); System.out.println(Integer.toBinaryString(cell1)); //- int optd = (cell1 & d) == d ? 1 : 0; System.out.println(optd);
15 1111 7 111 15 1111 13 1101 14 1110 10 1010 1
Oczywiście bitów może być więcej, jeśli zajdzie taka potrzeba.