Gymterview
junior

Что такое побитовые операции?

Побитовые (битовые) операции — это операции, которые выполняются над отдельными битами числа, а не над числом целиком. В Java они применяются к целочисленным типам (int, long, byte, short).

Аналогия: представьте ряд выключателей на стене. Побитовая операция AND — это проверка: «какие выключатели включены одновременно в обоих рядах?». OR — «включить выключатель, если он включён хотя бы в одном ряду».

Основные побитовые операции

Операция Оператор (Java) Описание Пример (8 бит)
AND (И) & 1, только если оба бита = 1 1010 & 1100 = 1000
OR (ИЛИ) | 1, если хотя бы один бит = 1 1010 | 1100 = 1110
XOR (Исключающее ИЛИ) ^ 1, если биты различаются 1010 ^ 1100 = 0110
NOT (НЕ) ~ Инвертирует все биты ~1010 = 0101
Сдвиг влево << Сдвигает биты влево, заполняя нулями 0001 << 3 = 1000
Арифметический сдвиг вправо >> Сдвигает вправо, сохраняя знаковый бит 1000 >> 2 = 1110 (для отрицательных)
Логический сдвиг вправо >>> Сдвигает вправо, заполняя нулями 1000 >>> 2 = 0010

Практическое применение

Пример
// Проверка чётности числа
boolean isEven = (n & 1) == 0;

// Установка бита в позиции pos
int result = value | (1 << pos);

// Сброс бита в позиции pos
int result = value & ~(1 << pos);

// Проверка бита в позиции pos
boolean isSet = (value & (1 << pos)) != 0;

// Умножение/деление на степень двойки
int mul8 = n << 3;   // n * 8
int div4 = n >> 2;   // n / 4

// Обмен значений без временной переменной (XOR swap)
a ^= b; b ^= a; a ^= b;

// Маски в правах доступа (битовые флаги)
int READ = 1;    // 001
int WRITE = 2;   // 010
int EXEC = 4;    // 100
int perms = READ | EXEC; // 101 — чтение и выполнение

Применение в стандартной библиотеке Java

  • java.util.EnumSet — внутри использует битовую маску для эффективного хранения множества enum-значений.
  • HashMap — вычисление индекса бакета: (n - 1) & hash (побитовое AND вместо остатка от деления, работает для степеней двойки).
  • Сетевые маски (IP): 255.255.255.0 = 11111111.11111111.11111111.00000000.
  • java.util.BitSet — коллекция для работы с множеством битов.

Вывод

Побитовые операции работают с отдельными битами и используются для работы с флагами, масками, оптимизации арифметических операций и в алгоритмах хэширования. В повседневной Java-разработке чаще всего встречаются в контексте HashMap, EnumSet и работы с сетевыми масками.

На собеседовании: junior-вопрос. Чаще всего спрашивают: почему размер HashMap — степень двойки (чтобы использовать (n-1) & hash вместо % n), как работает EnumSet (битовая маска), и как проверить чётность через & 1. Умение объяснить разницу между >> и >>> — тоже хороший маркер.