Zielony Smok - logo witryny

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.