Wszystkie artykuły

Operacje bitowe: jak działają AND, OR i XOR na poziomie bitów

W silnikach gier takich jak Unity czy Godot warstwy kolizji konfiguruje się jako maski bitowe: każda warstwa zajmuje jeden bit w liczbie całkowitej, a sprawdzenie, czy dwa obiekty mogą się zderzyć, sprowadza się do pojedynczej operacji AND między ich maskami. To konkretny przykład, dlaczego operacje bitowe mają znaczenie poza teorią z podręcznika.

AND, OR, XOR, NOT — cztery podstawowe operacje

  • AND (&) — wynikowy bit wynosi 1 tylko wtedy, gdy oba bity wejściowe wynoszą 1. Służy do sprawdzenia, czy konkretna warstwa jest aktywna w masce.
  • OR (|) — wynikowy bit wynosi 1, jeśli przynajmniej jeden z bitów wejściowych wynosi 1. Służy do łączenia kilku warstw lub flag w jedną wartość.
  • XOR (^) — wynikowy bit wynosi 1, jeśli bity wejściowe są różne; zastosowanie XOR dwukrotnie z tą samą wartością zwraca oryginał.
  • NOT (~) — odwraca każdy bit liczby.

Czym bitowy AND różni się od logicznego

Logiczny AND (&& w większości języków) działa na całych wartościach logicznych i zwraca true/false, podczas gdy bitowy AND (&) przetwarza każdy bit dwóch liczb osobno i zwraca liczbę. Mylenie tych dwóch to częsta przyczyna błędów, tym bardziej że w niektórych językach oba warianty kompilują się bez żadnego błędu typów.

Dlaczego to narzędzie idzie w parze z konwerterem systemów liczbowych

Maska warstw o wartości dziesiętnej 42 nic nie mówi na pierwszy rzut oka, ale ta sama maska zapisana jako 0b101010 od razu pokazuje, które konkretnie warstwy są aktywne. Dlatego operacje bitowe niemal zawsze rozważa się w systemie dwójkowym lub szesnastkowym, a nie dziesiętnym — konwerter systemów liczbowych to zwykle pierwszy krok, zanim AND/OR/XOR w ogóle nabiorą sensu wizualnego.

Do czego to się przydaje

  • Efektywne przechowywanie i sprawdzanie zestawu flag logicznych w jednej liczbie.
  • Rozumienie niskopoziomowego kodu pracującego z protokołami sieciowymi lub formatami binarnymi.
  • Optymalizacja obliczeń tam, gdzie operacje bitowe są szybsze niż zwykła arytmetyka.

Pułapka pierwszeństwa operatorów

W większości języków programowania operatory bitowe & i | mają niższy priorytet niż operatory porównania — dlatego wyrażenie takie jak if (a & b == c) jest w rzeczywistości obliczane jako a & (b == c), a nie tak, jak zwykle zamierza autor. To jedna z najczęstszych przyczyn trudnych do wykrycia błędów przy pracy z maskami bitowymi, a niezawodnym sposobem uniknięcia jej jest zawsze ujmowanie operacji bitowych w jawne nawiasy.

Wypróbuj narzędzie