У 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
Оператор << завжди вставляє нулі праворуч.
Натомість >> вставляє той самий біт, що й найлівіший біт (1, якщо число відʼємне, або 0, якщо додатне).
// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 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
Оператор побітового І (&) приймає два значення й виконує операцію І над кожним бітом.
Він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо обидва біти дорівнюють 1, то біт результату дорівнює 1.
Інакше біт результату дорівнює 0.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
Оператор побітового АБО (|) приймає два значення й виконує операцію АБО над кожним бітом.
Він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо хоч один із бітів дорівнює 1, біт результату дорівнює 1.
Інакше він дорівнює 0.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
Оператор побітового виключного АБО (^) виконує побітову операцію виключного АБО над двома значеннями.
Як і оператори побітового І та побітового АБО, він порівнює кожен біт першого значення з бітом у тій самій позиції другого значення.
Якщо лише один із них дорівнює 1, біт результату дорівнює 1.
Інакше він дорівнює 0.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)І нарешті, оператор побітового заперечення (~) перевертає кожен біт.
На відміну від попередніх операторів, це унарний оператор, який діє лише на одне значення.
~0b0110_0101;
// # => 0b1001_1010
Друг щойно надіслав нам повідомлення з важливою таємницею. Щоб іншим було нелегко його прочитати, повідомлення зашифрували, виконавши низку операцій над бітами. Нам потрібно буде написати методи, які допоможуть розшифрувати повідомлення.
Перший крок у розшифруванні повідомлення - скасувати зсув із процесу шифрування, зсунувши біти назад праворуч. У процесі розшифрування будуть подальші кроки, які припускають, що нулі вставляються з лівого боку.
Реалізуйте метод Secrets.shiftBack, який приймає значення й кількість позицій для зсуву та виконує зсув.
Secrets.shiftBack(0b1001, 2);
# => 0b0010
Далі є кілька бітів, які потрібно встановити в 1.
Реалізуйте метод Secrets.setBits, який приймає значення й маску та повертає результат встановлення бітів у значенні в 1.
Біт зі значення потрібно встановити в 1 там, де біт у масці також дорівнює 1.
Усі інші біти залишаються без змін.
Secrets.setBits(0b0110, 0b0101);
# => 0b0111
Деякі біти перевертаються під час шифрування. Їх потрібно буде перевернути назад, щоб розшифрувати повідомлення.
Реалізуйте метод Secrets.flipBits, який приймає значення й маску.
Маска вказує, які біти у значенні перевернути.
Якщо біт у масці дорівнює 1, цей біт перевертається у значенні.
Усі інші біти залишаються без змін.
Secrets.flipBits(0b1100, 0b0101);
# => 0b1001
Нарешті, є також певні біти, які завжди розшифровуються в 0.
Реалізуйте метод Secrets.clearBits, який приймає значення й маску.
Біти у value потрібно встановити в 0 там, де біт у масці дорівнює 1.
Усі інші біти залишаються без змін.
Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.