Усі статті

Побітові операції: як AND, OR і XOR працюють на рівні бітів

Побітові операції працюють не з числами як єдиним цілим, а з кожним окремим бітом їхнього двійкового представлення. Це дає прямий доступ до найнижчого рівня даних, минаючи звичну арифметику.

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), а не так, як очікує автор. Це одна з найпоширеніших причин важковловимих багів при роботі з бітовими масками, і надійний спосіб уникнути її — завжди явно розставляти дужки навколо побітових операцій.

Спробувати інструмент