
Operacje na pojedynczych bitach (Java)
Włączanie bitu
Aby włączyć bity używamy operatora sumy bitowej |.
Używamy zapisu:
x = x | maska albo
x |= maska
Tam, gdzie maska ma 0, wartości pozostają te same. Tam, gdzie maska ma 1, bity zerowe zmienią się na 1 (zostaną
włączone), a bity 1 pozostaną.
W poniższym przykładzie włączamy bit 4 (BinAria06.java):
int rgb = 167;
System.out.println(Integer.toBinaryString(rgb));
int maska = 8;
System.out.println(Integer.toBinaryString(maska));
int wynik1 = rgb | maska;
System.out.println(Integer.toBinaryString(wynik1));
Po uruchomieniu na konsoli zobaczymy:
10100111 1000 10101111
jak widzimy czwarty bit od prawej został wyłączony.
Wyłączenie bitu
Aby wyłączyć bit używamy konstrukcji wykorzystujące negację i koniunkcję binarną:
x = x & ~maska albo
x &= ~maska
W poniższym kodzie (BinAria07.java) wyłączymy czwarty bit od prawej, który w poprzednim przykładzie został włączony.
//włączenie bitu
int rgb = 167;
System.out.println(Integer.toBinaryString(rgb));
int maska = 8;
System.out.println(Integer.toBinaryString(maska));
int wynik1 = rgb | maska;
System.out.println(Integer.toBinaryString(wynik1));
//-wyłączenie bitu
int wynik2 = rgb & ~maska;
System.out.println(Integer.toBinaryString(wynik2));
Po uruchomieniu kodu na konsoli zobaczymy:
10100111 1000 10101111 10100111
Odwrócenie bitu
odwrócenie bitu można uzyskać stosując konstrukcję:
x = x ^ maska albo
x ^= maska
W wyniku zastosowania maski, tam gdzie maska ma 0, wartości pozostaną niezmienione, a tam gdzie maska ma 1, zostaną odwrócone.
W poniższym przykładzie (BinAria08.java) odwracamy bit trzeci od prawej:
//włączenie bitu
int rgb = 167;
System.out.println(Integer.toBinaryString(rgb));
//odwrócenie bitu
int maska1 = 4;
System.out.println(Integer.toBinaryString(maska1));
int wynik3 = rgb ^ maska1;
System.out.println(Integer.toBinaryString(wynik3));
Po uruchomieniu tego kodu na konsoli zobaczymy:
10100111 100 10100011
Sprawdzenie wartości bitu
Sprawdzenie wartości bitu wykonujemy we wcześniej opisany sposób Sprawdzanie
parzystości Java
Przykład (Binaria09.java) – wykorzystuję tu warunek if oraz pokazuję to samo przy użyciu operatora
trójargumentowego
//włączenie bitu
int rgb = 167;
System.out.println(Integer.toBinaryString(rgb));
//sprawdzenie wartości bitu
int maska4 = 4;
System.out.println(Integer.toBinaryString(maska4));
int wynik4;
if ((rgb & maska4) == maska4) {
wynik4 = 1;
} else {
wynik4 = 0;
}
System.out.println(wynik4);
//operator trojargumentowy
int wynik5 = (rgb & maska4) == maska4 ? 1 : 0;
System.out.println(wynik5);
Po uruchomieniu kodu na konsoli zobaczymy:
10100111 100 1 1
Ustawienie maski
| nr bitu, na którym chcemy wykonać operację |
wartość maski |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
| 4 | 8 |
| 5 | 16 |
| 6 | 32 |
| 7 | 64 |
| 8 | 128 |
Jeśli chcemy w masce użyć więcej niż jedną jedynkę wartości z tabeli dodajemy. Suma wartości (255)10 = (11111111)2.
