176 lines
4.6 KiB
Markdown
176 lines
4.6 KiB
Markdown
# Задачи по побитовым операциям на Java
|
|
|
|
> **Условие:** без использования операторов выбора (`if`, `switch`, `?:`), циклов (`for`, `while`, `do`) и объявления новых функций. Только `main`, побитовые операции, арифметика и `System.out.println`.
|
|
|
|
---
|
|
|
|
## Задача 1. Умножить число на 4 без умножения
|
|
|
|
**Условие:** Дано целое число `n`. Получить `n * 4`, используя только побитовые операции.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 5 | 20 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task1 {
|
|
public static void main(String[] args) {
|
|
int n = 5;
|
|
int result = n << 2; // сдвиг влево на 2 = умножение на 4
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 2. Разделить число на 2 без деления
|
|
|
|
**Условие:** Дано целое число `n`. Получить `n / 2`, используя только побитовые операции.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 20 | 10 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task2 {
|
|
public static void main(String[] args) {
|
|
int n = 20;
|
|
int result = n >> 1; // сдвиг вправо на 1 = деление на 2
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 3. Проверить, чётное ли число
|
|
|
|
**Условие:** Дано целое число `n`. Вывести `1`, если оно чётное, и `0`, если нечётное.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 7 | 0 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task3 {
|
|
public static void main(String[] args) {
|
|
int n = 7;
|
|
int result = (n & 1) ^ 1; // если младший бит 1 → 0, иначе → 1
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 4. Обнулить младший бит
|
|
|
|
**Условие:** Дано целое число `n`. Обнулить его самый младший установленный бит.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 12 | 8 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task4 {
|
|
public static void main(String[] args) {
|
|
int n = 12;
|
|
int result = n & (n - 1); // трюк: убирает младший установленный бит
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 5. Установить k-й бит в 1
|
|
|
|
**Условие:** Даны число `n` и позиция `k` (нумерация с 0). Установить `k`-й бит в 1.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 8 2 | 12 |
|
|
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task6 {
|
|
public static void main(String[] args) {
|
|
int n = 8; // 1000
|
|
int k = 2;
|
|
int result = n | (1 << k); // 1000 | 0100 = 1100 = 12
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 6. Инвертировать k-й бит
|
|
|
|
**Условие:** Даны число `n` и позиция `k`. Инвертировать `k`-й бит.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 10 1 | 8 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task7 {
|
|
public static void main(String[] args) {
|
|
int n = 10; // 1010
|
|
int k = 1;
|
|
int result = n ^ (1 << k); // 1010 ^ 0010 = 1000 = 8
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 7. Умножить число на 5 без умножения
|
|
|
|
**Условие:** Дано целое число `n`. Получить `n * 5`, используя только сдвиги и сложение.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 7 | 35 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task10 {
|
|
public static void main(String[] args) {
|
|
int n = 7;
|
|
int result = (n << 2) + n; // 4n + n = 5n
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Задача 8. Умножить число на 3 без умножения
|
|
|
|
**Условие:** Дано целое число `n`. Получить `n * 3`, используя только сдвиги и сложение.
|
|
|
|
|**Ввод:** |**Вывод:**|
|
|
|--|--|
|
|
| 7 | 21 |
|
|
|
|
**Решение:**
|
|
```java
|
|
public class Task10 {
|
|
public static void main(String[] args) {
|
|
int n = 7;
|
|
int result = (n << 1) + n; // 2n + n = 3n
|
|
System.out.println(result);
|
|
}
|
|
}
|
|
```
|
|
|