Что такое побитовые операции?
Побитовые (битовые) операции — это операции, которые выполняются над отдельными битами числа, а не над числом целиком. В 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. Умение объяснить разницу между>>и>>>— тоже хороший маркер.