Побитовые операции
от aNNiMON
В языке Java (да и в других языках тоже) есть такие побитовые операции:
И (AND) &
ИЛИ (OR) |
ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) ^
СДВИГ ВЛЕВО (SHL) <<
СДВИГ ВПРАВО (SHR) >>
ИНВЕРСИЯ ~
И (конъюнкция)
Правило: если хотя бы в одном из битов будет ноль, то результат тоже будет нулём.
Возьмём числа 34 и 27. В двоичной системе счисления им будут соответствовать числа 00100010 и 00011011.
Выполним операцию И для этих двух чисел:
00100010 - 34
00011011 - 27
00000010 - 2
То есть 34 & 27 = 2
ИЛИ (дизъюнкция)
Правило: если хотя бы в одном из битов будет единица, то результат тоже будет единицей.
Выполним операцию ИЛИ для всё тех же чисел 34 и 27.
00100010 - 34
00011011 - 27
00111011 - 59
ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2)
Правило: если биты отличаются, то результат - единица, если одинаковы - ноль.
Пример:
00100010 - 34
00011011 - 27
00111001 - 57
У исключающего или есть одно интересное свойство - если применить операцию дважды с одним и тем же вторым операндом b, то в результате получится исходное число a: (a ^ b) ^ b = a.
00111001 - 57
00011011 - 27
00100010 - 34
ПОБИТОВЫЙ СДВИГ ВЛЕВО
Сдвигает биты на указанное число разрядов влево. Биты слева исчезают, а справа заполняются нулями.
Пример 34 << 3:
00100010 - 34
00010000 - 16
ПОБИТОВЫЙ СДВИГ ВПРАВО
Сдвигает биты на указанное число разрядов вправо. Биты справа исчезают, а слева заполняются нулями.
Пример 34 >> 3:
00100010 - 34
00000100 - 4
ИНВЕРСИЯ
Инвертирует бит. Ноль становится единицей, а единица нулём.
Пример ~34:
00100010 - 34
11011101 - 221
Общая таблица
С помощью этих операций можно оперировать битами в числах.
Установка (значение x-ого слева бита будет равно 1): number |= 1 << x;
Очистка (значение x-ого слева бита будет равно 0): number &= ~(1 << x);
Переключение (0 меняется на 1, 1 на 0): number ^= 1 << x;
Проверка состояния бита: boolean enable = (number & (1 << x)) != 0;
И (AND) &
ИЛИ (OR) |
ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) ^
СДВИГ ВЛЕВО (SHL) <<
СДВИГ ВПРАВО (SHR) >>
ИНВЕРСИЯ ~
И (конъюнкция)
- a b &
- 0 0 0
- 0 1 0
- 1 0 0
- 1 1 1
Возьмём числа 34 и 27. В двоичной системе счисления им будут соответствовать числа 00100010 и 00011011.
Выполним операцию И для этих двух чисел:
00100010 - 34
00011011 - 27
00000010 - 2
То есть 34 & 27 = 2
ИЛИ (дизъюнкция)
- a b |
- 0 0 0
- 0 1 1
- 1 0 1
- 1 1 1
Выполним операцию ИЛИ для всё тех же чисел 34 и 27.
00100010 - 34
00011011 - 27
00111011 - 59
ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2)
- a b ^
- 0 0 0
- 0 1 1
- 1 0 1
- 1 1 0
Пример:
00100010 - 34
00011011 - 27
00111001 - 57
У исключающего или есть одно интересное свойство - если применить операцию дважды с одним и тем же вторым операндом b, то в результате получится исходное число a: (a ^ b) ^ b = a.
00111001 - 57
00011011 - 27
00100010 - 34
ПОБИТОВЫЙ СДВИГ ВЛЕВО
Сдвигает биты на указанное число разрядов влево. Биты слева исчезают, а справа заполняются нулями.
Пример 34 << 3:
00100010 - 34
00010000 - 16
ПОБИТОВЫЙ СДВИГ ВПРАВО
Сдвигает биты на указанное число разрядов вправо. Биты справа исчезают, а слева заполняются нулями.
Пример 34 >> 3:
00100010 - 34
00000100 - 4
ИНВЕРСИЯ
Инвертирует бит. Ноль становится единицей, а единица нулём.
Пример ~34:
00100010 - 34
11011101 - 221
Общая таблица
- a b & | ^
- 0 0 0 0 0
- 0 1 0 1 1
- 1 0 0 1 1
- 1 1 1 1 0
С помощью этих операций можно оперировать битами в числах.
Установка (значение x-ого слева бита будет равно 1): number |= 1 << x;
Очистка (значение x-ого слева бита будет равно 0): number &= ~(1 << x);
Переключение (0 меняется на 1, 1 на 0): number ^= 1 << x;
Проверка состояния бита: boolean enable = (number & (1 << x)) != 0;