& | ^ ~ << >> >>>
Побитовые операторы: работают с отдельными битами целых чисел — И, ИЛИ, исключающее ИЛИ, НЕ и сдвиги.
Доступно с: Java 1.0
Синтаксис
a & b a | b a ^ b ~a a << n a >> n a >>> nПримеры
И, ИЛИ, исключающее ИЛИ и НЕ для чисел 12 (1100) и 10 (1010):
void main() {
int a = 0b1100;
int b = 0b1010;
IO.println(a & b);
IO.println(a | b);
IO.println(a ^ b);
IO.println(~a);
IO.println(Integer.toBinaryString(a & b));
}Результат:
8
14
6
-13
1000Сдвиги: << умножает на степень двойки, >> делит с сохранением знака, >>> заполняет освободившиеся биты нулями:
void main() {
IO.println(1 << 4);
IO.println(100 >> 2);
IO.println(-16 >> 2);
IO.println(-16 >>> 28);
}Результат:
16
25
-4
15Набор флагов в одном числе: установка, проверка и сброс бита:
static final int READ = 1;
static final int WRITE = 1 << 1;
static final int EXEC = 1 << 2;
void main() {
int perms = READ | WRITE;
IO.println((perms & WRITE) != 0);
IO.println((perms & EXEC) != 0);
perms &= ~WRITE;
IO.println(perms);
}Результат:
true
false
1Примечания
У побитовых операторов низкий приоритет: perms & WRITE != 0 не скомпилируется, нужны скобки (perms & WRITE) != 0. С boolean операторы & и | тоже работают, но, в отличие от && и ||, всегда вычисляют обе части. Для набора флагов из enum удобнее и понятнее EnumSet. Есть составные формы: &=, |=, ^=, <<=.
См. также
- && || ! — Логические И, ИЛИ и НЕ для значений boolean.
- Integer.toBinaryString() — Записывает число в двоичной системе. Рядом — toHexString() и toOctalString().
- EnumSet — Множество значений одного enum. Работает как набор битовых флагов, но с понятным кодом.
- += -= *= /= — Выполняет операцию и сразу записывает результат в ту же переменную.
Вопросы и ответы по теме
В учебнике
- Побитовые операторы — Побитовые операторы Java: & | ^ ~, сдвиги << >> >>>, двоичная запись через Integer.toBinaryString, флаги и маски.