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.