Побитовые операции
Для a = 60 и b = 13:
a = 0011 1100
b = 0000 1101| Оператор | Результат | Смысл |
|---|---|---|
a & b | 12 | бит 1 только в обоих |
a | b | 61 | бит 1 хотя бы в одном |
a ^ b | 49 | биты различаются |
~a | -61 | инверсия всех 32 бит int |
a << 2 | 240 | сдвиг влево, нули справа |
a >> 2 | 15 | знаковый сдвиг вправо |
a >>> 2 | 15 | беззнаковый сдвиг вправо |
Разница >> и >>> видна на отрицательных числах: первый заполняет слева знаком, второй — нулями.
Маски
int flags = 0;
int READ = 1 << 0;
int WRITE = 1 << 1;
flags |= READ; // установить
boolean canRead = (flags & READ) != 0; // проверить
flags &= ~READ; // снять
flags ^= WRITE; // переключитьВажные правила Java
byte,shortиcharв выражении продвигаются доint;- для
intиспользуется только 5 младших битов расстояния сдвига:x << 32равноx << 0; - для
long— 6 младших битов; x << kпохоже на умножение на2^k, но overflow отбрасывает старшие биты;x & (x - 1)сбрасывает младший установленный бит приx != 0.
static boolean isPowerOfTwo(int x) {
return x > 0 && (x & (x - 1)) == 0;
}См. Двоичная система счисления.
На собеседовании
&и&&? Побитовая операция против short-circuit boolean.- Чем
>>отличается от>>>? Знаковым заполнением слева. - Почему
~60 == -61? Дополнительный код:~x == -x - 1. - Как проверить степень двойки?
x > 0 && (x & (x - 1)) == 0. - Тип результата
byteA & byteB?int.