Побитовые операции в Java
Побитовые операции в Java позволяют напрямую манипулировать битами целочисленных данных, что может быть полезно для работы с флагами, оптимизации памяти, шифрования и других задач, требующих работы на низком уровне. Эти операции выполняются очень быстро и являются неотъемлемой частью многих эффективных алгоритмов.
Основные побитовые операции в Java
Побитовое И (AND): &
Побитовое ИЛИ (OR): |
Побитовое исключающее ИЛИ (XOR): ^
Побитовое отрицание (NOT): ~
Сдвиг влево: <<
Сдвиг вправо с сохранением знака: >>
Логический сдвиг вправо: >>>
1. Побитовое И (AND) — &
Оператор & сравнивает два числа побитово и возвращает результат, где каждый бит будет равен 1 только в случае, если оба сравниваемых бита равны 1.
2. Побитовое ИЛИ (OR) — |
Оператор | сравнивает два числа и возвращает результат, где каждый бит будет равен 1, если хотя бы один из соответствующих битов равен 1.
3. Побитовое исключающее ИЛИ (XOR) — ^
Оператор ^ возвращает результат, где каждый бит равен 1, если соответствующие биты различны.
4. Побитовое отрицание (NOT) — ~
Оператор ~ инвертирует все биты числа: 1 превращается в 0, и наоборот. Это приводит к тому, что положительное число становится отрицательным.
5. Сдвиг влево — <<
Оператор сдвига влево сдвигает биты числа на заданное количество позиций влево, заполняя освободившиеся места нулями. Это аналогично умножению числа на степень двойки.
6. Сдвиг вправо с сохранением знака — >>
Этот оператор сдвигает биты числа вправо, при этом заполняя слева биты в зависимости от знака числа. Если число положительное, добавляются нули, если отрицательное — единицы.
#Java #Training #Medium #Bitwise_Operators
Побитовые операции в Java позволяют напрямую манипулировать битами целочисленных данных, что может быть полезно для работы с флагами, оптимизации памяти, шифрования и других задач, требующих работы на низком уровне. Эти операции выполняются очень быстро и являются неотъемлемой частью многих эффективных алгоритмов.
Основные побитовые операции в Java
Побитовое И (AND): &
Побитовое ИЛИ (OR): |
Побитовое исключающее ИЛИ (XOR): ^
Побитовое отрицание (NOT): ~
Сдвиг влево: <<
Сдвиг вправо с сохранением знака: >>
Логический сдвиг вправо: >>>
1. Побитовое И (AND) — &
Оператор & сравнивает два числа побитово и возвращает результат, где каждый бит будет равен 1 только в случае, если оба сравниваемых бита равны 1.
public class BitwiseAndExample {
public static void main(String[] args) {
int a = 5; // 00000101
int b = 3; // 00000011
int result = a & b; // 00000001
System.out.println("Результат побитового AND: " + result); // 1
}
}
Этот оператор часто используется для маскирования битов. Например, можно использовать маску для извлечения только определенных битов из числа.
2. Побитовое ИЛИ (OR) — |
Оператор | сравнивает два числа и возвращает результат, где каждый бит будет равен 1, если хотя бы один из соответствующих битов равен 1.
public class BitwiseOrExample {
public static void main(String[] args) {
int a = 5; // 00000101
int b = 3; // 00000011
int result = a | b; // 00000111
System.out.println("Результат побитового OR: " + result); // 7
}
}
Оператор используется для установки битов в 1, если нужно включить несколько флагов.
3. Побитовое исключающее ИЛИ (XOR) — ^
Оператор ^ возвращает результат, где каждый бит равен 1, если соответствующие биты различны.
public class BitwiseXorExample {
public static void main(String[] args) {
int a = 5; // 00000101
int b = 3; // 00000011
int result = a ^ b; // 00000110
System.out.println("Результат побитового XOR: " + result); // 6
}
}
Этот оператор часто применяется для таких задач, как проверка на различие или изменение значений на уровне отдельных битов.
4. Побитовое отрицание (NOT) — ~
Оператор ~ инвертирует все биты числа: 1 превращается в 0, и наоборот. Это приводит к тому, что положительное число становится отрицательным.
public class BitwiseNotExample {
public static void main(String[] args) {
int a = 5; // 00000101
int result = ~a; // 11111010 (в десятичной системе это -6)
System.out.println("Результат побитового NOT: " + result); // -6
}
}
Побитовое отрицание часто используется при работе с масками и с числами в формате дополнительного кода (two’s complement).
5. Сдвиг влево — <<
Оператор сдвига влево сдвигает биты числа на заданное количество позиций влево, заполняя освободившиеся места нулями. Это аналогично умножению числа на степень двойки.
public class LeftShiftExample {
public static void main(String[] args) {
int a = 5; // 00000101
int result = a << 2; // 00010100 (в десятичной системе это 20)
System.out.println("Результат сдвига влево: " + result); // 20
}
}
6. Сдвиг вправо с сохранением знака — >>
Этот оператор сдвигает биты числа вправо, при этом заполняя слева биты в зависимости от знака числа. Если число положительное, добавляются нули, если отрицательное — единицы.
public class RightShiftExample {
public static void main(String[] args) {
int a = -5; // 11111111111111111111111111111011
int result = a >> 2; // 11111111111111111111111111111110
System.out.println("Результат сдвига вправо с сохранением знака: " + result); // -2
}
}
#Java #Training #Medium #Bitwise_Operators
7. Логический сдвиг вправо — >>>
Логический сдвиг вправо отличается от сдвига с сохранением знака тем, что всегда добавляет нули, независимо от того, положительное или отрицательное число.
Применение побитовых операций
Побитовые операции широко используются в низкоуровневых задачах, таких как:
Маскирование битов: Выборка или установка конкретных битов с использованием побитового И или ИЛИ.
Работа с флагами: Побитовые операции часто применяются для работы с флагами, когда одно целое число содержит несколько логических состояний.
Оптимизация операций: Некоторые математические операции, такие как умножение и деление на степени двойки, могут быть реализованы с помощью сдвигов, что ускоряет выполнение программы.
#Java #Training #Medium #Bitwise_Operators
Логический сдвиг вправо отличается от сдвига с сохранением знака тем, что всегда добавляет нули, независимо от того, положительное или отрицательное число.
public class UnsignedRightShiftExample {
public static void main(String[] args) {
int a = -5; // 11111111111111111111111111111011
int result = a >>> 2; // 00111111111111111111111111111110
System.out.println("Результат логического сдвига вправо: " + result); // 1073741822
}
}
Применение побитовых операций
Побитовые операции широко используются в низкоуровневых задачах, таких как:
Маскирование битов: Выборка или установка конкретных битов с использованием побитового И или ИЛИ.
Работа с флагами: Побитовые операции часто применяются для работы с флагами, когда одно целое число содержит несколько логических состояний.
Оптимизация операций: Некоторые математические операции, такие как умножение и деление на степени двойки, могут быть реализованы с помощью сдвигов, что ускоряет выполнение программы.
#Java #Training #Medium #Bitwise_Operators