Побітові операції працюють не з числами як єдиним цілим, а з кожним окремим бітом їхнього двійкового представлення. Це дає прямий доступ до найнижчого рівня даних, минаючи звичну арифметику.
AND, OR, XOR, NOT
- AND (&) — результатний біт дорівнює 1, лише якщо обидва вхідні біти дорівнюють 1. Використовується для "маскування" — вибірки певних бітів.
- OR (|) — результатний біт дорівнює 1, якщо хоча б один із вхідних бітів дорівнює 1. Використовується для встановлення прапорців.
- XOR (^) — результатний біт дорівнює 1, якщо вхідні біти різні. Має властивість оборотності: застосування XOR двічі з тим самим значенням повертає оригінал.
- NOT (~) — інвертує кожен біт числа.
Чим побітовий AND відрізняється від логічного
Логічний AND (&& у більшості мов) працює з булевими значеннями цілком і дає true/false, тоді як побітовий AND (&) обробляє кожен біт двох чисел окремо й повертає число. Плутанина між ними — поширена причина багів.
Типові застосування XOR
XOR часто використовують для простого (не криптографічно стійкого) шифрування, для перевірки парності бітів, а також у деяких алгоритмах обміну значень двох змінних без тимчасової третьої змінної.
Навіщо це потрібно
- Ефективно зберігати й перевіряти набір булевих прапорців в одному числі.
- Розуміти низькорівневий код роботи з мережевими протоколами чи бінарними форматами.
- Оптимізувати обчислення там, де побітові операції швидші за звичайну арифметику.
Пастка з пріоритетом операторів
У більшості мов програмування побітові оператори & і | мають нижчий пріоритет, ніж оператори порівняння — тому вираз на кшталт if (a & b == c) насправді обчислюється як a & (b == c), а не так, як очікує автор. Це одна з найпоширеніших причин важковловимих багів при роботі з бітовими масками, і надійний спосіб уникнути її — завжди явно розставляти дужки навколо побітових операцій.