Побитовые операции работают непосредственно на уровне отдельных битов.
Побитовое И — &
int a = 12; // 1100 в двоичной
int b = 10; // 1010 в двоичной
int result = a & b; // 1000 → 8
// 1100 (12)
// 1010 (10)
// ----
// 1000 (8)Побитовое ИЛИ — |
int a = 12; // 1100
int b = 10; // 1010
int result = a | b; // 1110 → 14
// 1100 (12)
// 1010 (10)
// ----
// 1110 (14)Побитовое исключающее ИЛИ — ^
int a = 12; // 1100
int b = 10; // 1010
int result = a ^ b; // 0110 → 6
// 1100 (12)
// 1010 (10)
// ----
// 0110 (6)Побитовое НЕ — ~
int a = 12; // 0000 0000 0000 0000 0000 0000 0000 1100
int result = ~a; // 1111 1111 1111 1111 1111 1111 1111 0011 → -13Битовый сдвиг влево — <<
int a = 5; // 0101
int result = a << 2; // 010100 → 20
// Эквивалентно умножению на 2^n
// 5 * 2^2 = 20Битовый сдвиг вправо — >>
int a = 20; // 010100
int result = a >> 2; // 0101 → 5
// Эквивалентно делению на 2^n (с сохранением знака)
// 20 / 2^2 = 5
int negative = -8; // 1111 1000
int result2 = negative >> 2; // 1111 1110 → -2Беззнаковый сдвиг вправо — >>>
int a = -1; // 1111 1111 1111 1111 1111 1111 1111 1111
int result = a >>> 1; // 0111 1111 1111 1111 1111 1111 1111 1111 → 2147483647Массив — это упорядоченный набор элементов, хранящийся в непрерывной области памяти. Каждый элемент имеет целочисленный индекс.
Особенности массивов в Java:
- Фиксированный размер, т. е. длина массива задается при его создании и не меняется.
- Однотипность, т. е. все элементы одного типа
- Индексация начинается с 0.
- При выходе за границы массива выбрасывается исключение
ArrayIndexOutOfBoundsException. - Массивы являются объектами.
int myArray[] = new int[5]; // Объявить и создать массив типа int длинны 5
double[] numbers = new double[10]; // Объявить и создать массив типа double длинны 10
int n = 100; // Создать переменную типа int со значением 100
String items[]; // Объявить массив строк
strings = new String[n]; // Создать массив строк длинны n = 100myArray[0] = 10;
myArray[1] = 20;
myArray[2] = 30;
numbers[0] = 1.0;
numbers[1] = 2.0;
numbers[2] = 3.0;
items[0] = "text 1";
items[1] = "text 2";
items[2] = "text 3";// Объявить, создать и инициализировать массив типа char
char symbols[] = {'+', '-', '/', '%'};
// Объявить массив типа byte
byte[] bytes;
// Создать и инициализировать массив типа byte
bytes = new byte[]{-128, -127, -126, -125};
### Доступ к элементам массива
```java
// Считать значение элемента массива по индексу 0
String item = items[0];
// Присвоить значение элементу массива по индексу 0
items[0] = "new text";
// Перебрать массив
for (int i = 0; i < numbers.length; i++) {
double number = numbers[i];
System.out.println(number);
}Двумерные массивы:
int n = 2; int m = 3;
// Объявить и создать двумерный массив (n x m)-элементов типа double
double[][] matrix = new double[n][m];
// Заполнить массив случайными числами
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[i][j] = Math.random();
}
}Массивы размерности n, n > 2
// Объявить и создать трехмерный массив (3 x 3 x 2)-элементов типа int
int cube[][][] = new int[3][3][2];
// Заполнить трехмерный массив нулями
for (int i = 0; i < cube.length; i++) {
for (int j = 0; j < cube[i].length; j++) {
Arrays.fill(cube[i][j], 0);
}
}Статическая инициализация:
// Статическая инициализация двумерного массива (2 x 3)-элементов типа int
int table[][] = {{1,-1,-1},{-1,0,0}};Нерегулярные массивы — это многомерные массивы, в которых внутренние массивы могут иметь разную длину.
Объявление и инициализация:
int[][] jaggedArray; // Объявление нерегулярного массива
// Создание внешнего массива
jaggedArray = new int[3][]; // размеры трех внутренних массивов пока еще не определены
// Создание внутренних массивов разной длины
jaggedArray[0] = new int[2]; // Первая строка - 2 элемента
jaggedArray[1] = new int[3]; // Вторая строка - 3 элемента
jaggedArray[2] = new int[1]; // Третья строка - 1 элементИнициализация с заполнением поэлементно:
int[][] matrix = new int[3][];
matrix[0] = new int[]{1, 2};
matrix[1] = new int[]{3, 4, 5};
matrix[2] = new int[]{6};Статическая инициализация:
int[][] jagged = {
{1, 2}, // 2 элемента
{3, 4, 5, 6}, // 4 элемента
{7}, // 1 элемент
{8, 9, 10} // 3 элемента
};Класс Arrays предоставляет полезные методы для работы с массивами.
import java.util.Arrays;
int[] numbers = {5, 2, 8, 1, 9};
// Сортировка
Arrays.sort(numbers); // [1, 2, 5, 8, 9]
// Бинарный поиск (только в отсортированном массиве)
int index = Arrays.binarySearch(numbers, 5); // 2
// Заполнение массива
Arrays.fill(numbers, 0); // [0, 0, 0, 0, 0]
// Копирование массива
int[] copy = Arrays.copyOf(numbers, numbers.length);
// Сравнение массивов
boolean equal = Arrays.equals(numbers, copy);Вывод массивов в командную строку:
// Напечатать одномерный массив в командной строке
System.out.println(Arrays.toString(items));
// Напечатать двумерный массив в командной строке
for (int i = 0; i < matrix.length; i++) {
System.out.println(Arrays.toString(matrix[i]));
}
// Напечатать трехмерный массив в командной строке
for (int i = 0; i < cube.length; i++) {
for (int j = 0; j < cube[i].length; j++) {
System.out.println(Arrays.toString(cube[i][j]));
}
}Аргумент инструкции switch — число, строка или перечисление.
Scanner scanner = new Scanner(System.in);
String status = scanner.nextLine();
switch (status) {
case "accepted" :
System.out.println("Принять");
break;
case "revision" :
System.out.println("Доработать");
break;
case "declined" :
System.out.println("Отклонить");
break;
default :
System.out.println("Статус не определен");
}Цикл while (условие проверяется до итерации):
int count = 0;
while (count < 5) {
System.out.println(count);
count++;
}Цикл do-while (условие проверяется после итерации):
do {
System.out.println(count);
count--;
} while (count >= 0);Цикл for-each:
int[] array = {10, 20, 30, 40, 50};
for (int i: array) {
System.out.println(i);
}Инструкция перехода break завершает цикл:
// Бесконечный цикл
for (;;) {
double d = Math.random();
System.out.println(d);
if (d > 0.75)
break; // Выход из цикла
}Инструкция перехода continue завершает итерацию:
for (int i = 100; i > 0; i--) {
if (i % 10 == 0)
continue; // Выход из итерации
System.out.println(i);
}Задание 3-1 — 1 балл
- Упорядочить элементы двумерного нерегулярного массива целых чисел по возрастанию сумм их элементов.
- Использовать статистическую инициализацию нерегулярного массива. Внешний массив должен иметь размер не менее 5, внутренние массивы должны иметь разные размеры не менее 3.
- Реализовать вывод исходного и упорядоченного массивов в командную строку.
Задание 3-2 — 1 балл
- Найти сумму попарных расстояний Хэмминга между всеми элементами массива целых чисел. (Расстояние Хэмминга между двумя числами — это количество позиций, в которых биты различаются. Например, число 4 в побитовой записи
"0100",а число 9 —"1001", сравниваем биты по позициям:0≠1,1≠0,0=0,0≠1, различаются 3 позиции, следовательно расстояние Хэмминга равно 3.) - Реализовать ввод элементов массива из командной строки в виде перечисления через запятую, например:
"4, 9, 14, 2". - Реализовать вывод вычислений попарных расстояний Хэмминга в командную строку, например, в следующем виде:
DH(4, 9) = 3
DH(4, 14) = 3
DH(4, 2) = 1
...
DH(14, 2) = 2
- Реализовать вывод общей суммы расстояний Хэмминга в командную строку.
Задание 3-3 — 2 балла
- Реализуйте игру "Сапер" с использованием двумерных массивов. Игровое поле представляет собой матрицу, где каждая ячейка может быть либо пустой, либо содержать мину. Цель игры — открыть все пустые ячейки, не наступив на мину.
- Реализовать ввод хода игрока и вывод результатов хода через командную строку.
- Сопроводить программу Javadoc-коментариями
- Сгенерировать документацию в формате HTML (с помощью команды
javadoc). - Собрать проект в виде запускаемого JAR-файла.
- Запустить полученный JAR-файл из командной строки.
- Как вы объявили массив?
- Как вы инициализировали массив?
- Как вы заполнили элементы массивы значениями?
- Как изменить размер вашего массива?
- Используете ли вы статическую инициализацию массивов в вашем коде?
- Является ли ваш массив нерегулярным?
- Как вы используете доступ к элементам массива?
- Какую размерность имеет ваш массив?
- Какой размер (длину) имеет ваш массив?
- Строки или столбцы матрицы представляют элементы вашего двумерного массива?
- Как вы сортируете элементы массива?
- Как вы выводите элементы массива в командную строку?
- Какие побитовые операции вы использовали?
- Какие циклы есть в вашем коде?
- Есть ли инструкции перехода в вашем коде?
- На какой цикл другого вида можно заменить цикл, который вы написали?
- Как работает инструкция
break? - Как работает инструкция
continue? - Как работает инструкция
switch? - В каком пакете находится ваш файл с исходным кодом?
- Какие классы были импортированы вами?
- В каком пакете находится ваш Main-класс?
- Какие классы вы импортировали в вашем коде?
- Как принято именовать классы?
- Какие локальные переменные вы объявили?
- Как вы инициализировали ваши локальные переменные?
- Какие блоки кода есть в вашем исходном коде?
- Какие простые типы данных используются в вашем коде?
- Какой тип данных имеет какая-либо переменная в вашем коде?
- Какой возвращаемый тип данных имеет какое-либо выражение (вычисляемая операция) в вашем коде?