Найти в Дзене
тотСамыйАйтишник

#9 Java: Побитовые операторы(операторы присваивания + приоритет выполнения).

Java: План и дорожная карта развития + СОДЕРЖАНИЕ.

№8 Java: Явные и неявные приведения примитивных типов.

Приветствую Тебя, мой дорогой друг. В этой статье разберем еще один вид операторов, так называемые "Побитовые операторы". Надеюсь, ты знаком с двоичной системой счисления, так как, она нам определенно очень пригодится. Будем выполнять действия над отдельными битами наших операндов. Ну, а если ты не знаком с двоичной системой, то вкратце тебе расскажу (более обширную информацию можно получить на wiki). Но каждый уважающий себя Айтишник(а это на минуточку программисты всех мастей, админы и другие сказочные существа) обязаны знать как работать с двоичной системой.

Калькулятор и побитовые операции.
Калькулятор и побитовые операции.

Итак, значения в двоичной системе счисления, представляют собой ряд чисел состоящих из 1 и 0. К примеру из привычной тебе десятичной системы, число 13 в двоичной будет выглядеть так 1101. В бинарной(так ее еще по другому называют) расчет с права-налево, самый младший разряд начинается с единицы и с каждым битом увеличивается в два раза.

Двоичная система для чисел 1 байт.
Двоичная система для чисел 1 байт.

Так как из 13 получилось 1101? Нам нужно найти один бит или сумму бит равное нашему значению. Остановимся на первых четырех, так как далее идут значения больше 13. Итак, 8, 4, 2, 1 подберем комбинацию чтобы получить 13. Очевидно, взять необходимо разряды под номерами 4(значение 8), 3(значение 4) и 1(значение 1), получим 8+4+1=13. Те разряды которые мы отобрали, вместо 0 поставить 1.

Двоичная система для чисел 1 байт.
Двоичная система для чисел 1 байт.

Получаем наше число в двоичной системе счисления.

Двоичная система для чисел 1 байт.
Двоичная система для чисел 1 байт.

Это очень кратко, если нужна будет статья про двоичной системе, напишите в комментариях.

Вернемся к нашей теме "Побитовые операторы".

В Java побитовые операции выполняются только над целыми числами, следовательно, применимы только к определенным типам данных, таким как: "byte", "char", "short", "int", "long". При использовании побитовых операций, результат будет приведен к типу "int", а если один из операндов "long", то и результат будет типа "long".

1. Унарный оператор "~"(символ тильда) дополнение(NOT) - данный оператор зеркально изменяет переданное значение, то есть 0 на 1, а 1 на 0. К примеру наше число 13 = 1101, ~1101 = 0010 если перевести в десятичную, получится число 2. Проверим себя, вызовем калькулятор Windows, переведем его в режим "Программист"(слайд №1). Установим в десятичную систему "Dec", выберем количество байт и сделаем "1 байт"(слайд №2). Вводим число 13, видим дублируются данные в двоичной системе "0000 1101", а мы знаем что 1 байт это 8 бит, соответственно у нас 8 разрядов "00001101". Произведем наше действие, в калькуляторе кнопка "Not" жмем(слайд №3). Видим результат -14, не совсем верный результат, так как мы использовали 4 разряда, а калькулятор все 8, первым четырем разрядам вместо 0 поставил 1, следовательно, в нашей ситуации смотреть нужно на последние 4 разряда, вот там наша правильная противоположность. Но сколько это "0010"? Очищаем окно результата кнопкой на калькуляторе "С". Выбираем двоичную систему "Bin" и набираем "10"(слайд №4). Видим что калькулятор выводит "0000 0010" наши последние четыре разряда "0010" и переводим обратно в десятичную "Dec" результат число 2(слайд №5).

Давай попробуем в Java, воспользуемся методом "toBinaryString" класса "Integer"(о ссылочных типах данных, будем говорить следующей статье) и передадим в метод нашу переменную "varInt" со значением 13. Метод "toBinaryString" отобразит наше число в двоичной системе "1101", помним что тип данных "int" занимает 4 байта, а это 32 разряда, следовательно, первые слева 28 нулей метод не показывает(если бы показал, то выглядело бы так "00000000000000000000000000001101"). Осталось применить нашу операцию, в результате опять видим 14, с прошлого примера с калькулятором, мы понимаем что первые 28 нулей преобразовались в единицу и смотреть нужно на 4 последних бита, а там "0010" наше число 2.

Результат в Java.
Результат в Java.

Для данного оператора не предусмотрен оператор присвоения(то есть более короткой версии "~=" нет).

2. Побитовая конъюнкция (AND) "&" (символ амперсанд) - данный оператор используется как выключение отдельных битов.

Побитовая конъюнкция (AND).
Побитовая конъюнкция (AND).

Для примера используем числа 13 = 1101 и 10 = 1010, пробуем рассчитать справа на лево "1101 & 1010 = 1&0=0, 0&1=0, 1&0=0, 1&1=1" ответ "1000" что соответствует десятичному числу 8.

На калькуляторе кнопочка "And". Вводи в десятичной системе число 13 жми "And" и набирай число 10, равно 8.

Калькулятор.
Калькулятор.

Ну а теперь, попробуем в Java.

Результат в Java.
Результат в Java.

Предусмотрен оператор присвоения "&=". Но и не забываем про приоритет, в выражении "varInt &= varInt2 + 1" вначале будет выполнено то что справа "varInt2 + 1", после "varInt = varInt & 11", то есть выражение примет вид "varInt = varInt & (varInt2 + 1)".

Результат в Java.
Результат в Java.

3. Побитовая дизъюнкция (OR) "|" (символ вертикальной черты) - если у операндов в вычисляемой позиции имеется хоть один разряд равный 1, то результат будет 1.

Побитовая дизъюнкция (OR).
Побитовая дизъюнкция (OR).

Для примера используем числа 13 = 1101 и 10 = 1010, пробуем рассчитать справа на лево "1101 | 1010 = 1|0=1, 0|1=1, 1|0=1, 1|1=1" ответ "1111" что соответствует десятичному числу 15.

На калькуляторе кнопочка "Or". Вводи в десятичной системе число 13 жми "Or" и набирай число 10, равно 15.

Калькулятор.
Калькулятор.

Идем в Java.

Результат в Java.
Результат в Java.

Предусмотрен оператор присвоения "|=". Но и не забываем про приоритет, в выражении "varInt |= varInt2 + 1" вначале будет выполнено то что справа "varInt2 + 1", после "varInt = varInt | 11", то есть выражение примет вид "varInt = varInt | (varInt2 + 1)".

Результат в Java.
Результат в Java.

4. Побитовое исключающее (XOR) символ "^" - если два сравниваемых бита имеют разное значение, то результат будет 1.

Побитовое исключающее (XOR).
Побитовое исключающее (XOR).

Для примера используем числа 13 = 1101 и 10 = 1010, пробуем рассчитать справа на лево "1101 ^ 1010 = 1^0=1, 0^1=1, 1^0=1, 1^1=0" ответ "0111" что соответствует десятичному числу 7.

На калькуляторе кнопочка "Xor". Вводи в десятичной системе число 13 жми "Or" и набирай число 10, равно 7.

Калькулятор.
Калькулятор.

Идем в Java.

Результат в Java.
Результат в Java.

Предусмотрен оператор присвоения "^=". Но и не забываем про приоритет, в выражении "varInt ^= varInt2 + 1" вначале будет выполнено то что справа "varInt2 + 1", после "varInt = varInt ^ 11", то есть выражение примет вид "varInt = varInt ^ (varInt2 + 1)".

Результат в Java.
Результат в Java.

5.Побитовый сдвиг влево, символ "<<" - данная операция как бы побитовое умножение, то есть она добавляет в правую часть нули в зависимости от значения второго операнда, тем самым происходит смещение бит в лево для первого операнда.

Для примера используем числа 5 = 0101 и 2 = 0010, 5<<2, к первому операнду, справа должны добавить два нуля и произвести сдвиг на два разряда влево, результат получается "010100" что, соответствует 20 в десятичной системе.

На калькуляторе кнопочка "Lsh". Вводи в десятичной системе число 5 жми "Lsh" и набирай число 2, равно 20.

Калькулятор.
Калькулятор.

Идем в Java.

Результат в Java.
Результат в Java.

5.Побитовый сдвиг вправо, символ ">>" - данная операция как бы побитовое деление, эта же операция наоборот добавляет в левую часть нули в зависимости от значения второго операнда, тем самым происходит смещение бит в право для первого операнда.

Для примера используем числа 5 = 0101 и 2 = 0010, 5>>2, к первому операнду, слева должны добавить два нуля и произвести сдвиг на два разряда в право, результат получается "0001" что, соответствует 1 в десятичной системе.

На калькуляторе кнопочка "Rsh". Вводи в десятичной системе число 5 жми "Rsh" и набирай число 2, равно 1.

Калькулятор.
Калькулятор.

Идем в Java.

Результат в Java.
Результат в Java.

Табличка приоритетности операций, в ней видно что побитовые операторы имеют меньший приоритет по сравнению с арифметическими.

Приоритет операторов.
Приоритет операторов.

Пока на это все, следующей статье порешаем задачки по операторам. До встречи.

статья № 10 Java: Логические операторы.

Поставь лайк если понравилась статья, тебе всего лишь "клик", а мне радости полные штаны =). Подписывайся на канал, будет много интересных публикаций =).