У Java є оператори для роботи з бітами цілочисельного типу (byte, short, int, long або char).
Щоб зсунути біти ліворуч, використовуємо <<, а щоб зсунути праворуч, >>.
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
>> також називають оператором знакового зсуву, або арифметичного зсуву, бо біт, який він вставляє, збігається з його знаковим бітом.
Це найлівіший біт. Він дорівнює 0, якщо значення додатне, і 1, якщо відʼємне.
Зсув ліворуч за допомогою << завжди вставляє нулі праворуч.
// Shift 2 places to the right preserves the sign
// The binary value is two's complement of 0b0000_0110 (or 0x00000026), so the binary representation will be
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
Використовуємо >>> натомість, коли під час зсуву праворуч потрібно вставляти нулі.
Вставляння нулів під час зсуву також називають логічним зсувом.
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
Побітовий оператор AND (&) приймає два значення і виконує AND над кожним бітом.
Він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо обидва біти дорівнюють 1, то біт результату теж 1.
Інакше біт результату дорівнює 0.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
Побітовий оператор OR (|) приймає два значення і виконує OR над кожним бітом.
Він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо хоч один із бітів дорівнює 1, біт результату теж 1.
Інакше він дорівнює 0.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
Побітовий оператор XOR (^) виконує побітовий XOR над двома значеннями.
Як і побітові оператори AND та OR, він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо лише один із них дорівнює 1, біт результату дорівнює 1.
Інакше він дорівнює 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)І наостанок, побітовий оператор заперечення (~) інвертує кожен біт.
На відміну від попередніх операторів, це унарний оператор, який діє лише на одне значення.
~0b0110_0101;
// # => 0b1001_1010