Inne wpisy na podobny temat:

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. Poniewaz ś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 uzyjemy 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ąca tylko ściane lewa 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.

Kod

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, jesli zajdze taka potrzeba.

Dodaj komentarz

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