Cześć.
Dawno tutaj nie pisałem, ale może przejdę do rzeczy. Czy można dostać się bezpośrednio do któregoś z bitów w Java ? Na przykład po zadeklarowaniu zmiennej [ byte b = 5 ] i chcę sprawdzić czy drugi bit po prawej to 0 .
Cześć.
Dawno tutaj nie pisałem, ale może przejdę do rzeczy. Czy można dostać się bezpośrednio do któregoś z bitów w Java ? Na przykład po zadeklarowaniu zmiennej [ byte b = 5 ] i chcę sprawdzić czy drugi bit po prawej to 0 .
Sprawdź czym jest koniunkcja i zechciej jej użyć.
No dobra, ale to oznacza, że muszę mieć zmienną pomocniczą, a chciałbym operować na jednym bajcie. W sensie np. 00001010 i sprawdzam czy drugi bit od prawej jest 1.
Wiem, że mogę to zrobić wykorzystując operatory logiczne, ale czy jest jakiś prostszy sposób ?
Problem rozwiązany.
Nie musisz mieć zmiennej pomocniczej – wystarczy liczbowy literał. Jeśli wiesz który bit chcesz sprawdzić to również wiesz jaką wartość wykorzystać w koniunkcji. Masz liczbę 5
dziesiętnie, która binarnie (jako bajt) wygląda tak:
00000101
Teraz chcesz sprawdzić czy drugi bit jest zapalony, więc musisz wykonać koniunkcję z liczbą, której tylko drugi bit jest zapalony:
00000010
To jest binarne 2
. Koniunkcja wyglądać będzie tak:
00000101
and 00000010
------------
00000000
Par zapalonych bitów nie ma, więc w wyniku otrzymujemy same zgaszone bity, czyli liczbę 0
. Jeśli wynikiem koniunkcji jest liczba 0
to znaczy, że sprawdzany bit jest zgaszony – w przeciwnym razie, czyli jeśli wynik będzie większy od 0
, to sprawdzany bit jest zapalony.
Weźmy liczbę 5
i sprawdźmy jej trzeci bit:
00000101
and 00000100
------------
00000100
Mamy parę zapalonych bitów na trzeciej pozycji, więc wynik otrzymujemy większy od 0
– konkretnie 4
. Tak więc najprostszym sposobem sprawdzenia stanu danego bitu jest wykonanie koniunkcji i sprawdzenie, czy wynik jest większy od 0
.
Inny sposób to wykonanie przesunięcia bitowego w prawo i sprawdzenie stanu najmłodszego bitu (za pomocą koniunkcji). Jeśli wynikiem jest 0
to sprawdzany bit jest zgaszony, a jeśli 1
to zapalony. Rozmiar przesunięcia to numer bitu, liczony od 0
.
Przykład z liczbą 5
:
00000101
shr 2 00000001
and 00000001
----------------
00000001
Również stan bitu zostaje poprawnie określony. Różnica polega na tym, że wykonujemy dwie operacje, a nie jedną. Można też wykonać to na odwrót – najpierw przeprowadzić przesunięcie bitowe liczby 1
w lewo, a następnie przeprowadzić koniunkcję z naszą liczbą (tutaj: 5
):
00000001
shl 2 00000100
and 00000101
----------------
00000100
Jak widzisz, sposób również działa. I znów poprzedni schemat – jeśli wynik jest równy 0
to sprawdzany bit jest zgaszony, a jeśli jest większy od 0
to bit jest zapalony.
W przykładach użyłem operatorów and
, shr
i shl
istniejących w Pascalu – tylko dla zobrazowania obliczeń.