Operacje na bitach

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 .

0

Sprawdź czym jest koniunkcja i zechciej jej użyć.

0

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 ?

0

Problem rozwiązany.

0

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ń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1