Треки
/
Java
Java
/
Вправи
/
Секрети
Секрети

Секрети

Навчальна вправа

Вступ

Робота з бітами

У 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

Вказівки

Друг щойно надіслав нам повідомлення з важливою таємницею. Щоб іншим було нелегко його прочитати, повідомлення зашифрували, виконавши низку операцій над бітами. Нам потрібно буде написати методи, які допоможуть розшифрувати повідомлення.

1. Зсунути біти назад

Перший крок у розшифруванні повідомлення - скасувати зсув із процесу шифрування, зсунувши біти назад праворуч. У процесі розшифрування будуть подальші кроки, які припускають, що нулі вставляються з лівого боку.

Реалізуйте метод Secrets.shiftBack, який приймає значення й кількість позицій для зсуву та виконує зсув.

Secrets.shiftBack(0b1001, 2);
# => 0b0010

2. Встановити деякі біти

Далі є кілька бітів, які потрібно встановити в 1.

Реалізуйте метод Secrets.setBits, який приймає значення й маску та повертає результат встановлення бітів у значенні в 1. Біт зі значення потрібно встановити в 1 там, де біт у масці також дорівнює 1. Усі інші біти залишаються без змін.

Secrets.setBits(0b0110, 0b0101);
# => 0b0111

3. Перевернути конкретні біти

Деякі біти перевертаються під час шифрування. Їх потрібно буде перевернути назад, щоб розшифрувати повідомлення.

Реалізуйте метод Secrets.flipBits, який приймає значення й маску. Маска вказує, які біти у значенні перевернути. Якщо біт у масці дорівнює 1, цей біт перевертається у значенні. Усі інші біти залишаються без змін.

Secrets.flipBits(0b1100, 0b0101);
# => 0b1001

4. Очистити конкретні біти

Нарешті, є також певні біти, які завжди розшифровуються в 0.

Реалізуйте метод Secrets.clearBits, який приймає значення й маску. Біти у value потрібно встановити в 0 там, де біт у масці дорівнює 1. Усі інші біти залишаються без змін.

Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Java Exercism

Час розпочати Секрети?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.