JavaRush /Курсы /Java Multithreading /Побитовые операторы (&, xor, <<,...)

Побитовые операторы (&, xor, <<,...)

Java Multithreading
10 уровень , 7 лекция
Открыта
Побитовые операторы (&, xor, <<,...) - 1

— Привет, Амиго!

И еще одна маленькая лекция о побитовых операторах.

Знаешь же, что кроме логических операторов AND(&&), OR(||) и NOT(!), есть еще побитовые AND(&), OR(|), NOT(~), XOR(^)?

— Ага. В свое время Билаабо давал очень хорошую лекцию на эту тему.

— Так вот, насчет этих операторов у меня есть две новости:

Во-первых, их можно применять к boolean-переменным, кроме оператора NOT(~), так же, как и логические операторы.

Во-вторых, при их применении ленивых вычислений не происходит.

Смотри пример:

Код Аналог
if (a!=null && a.getName()!=null && c!=null)
{
 c.setName(a.getName());
}
if (a!=null)
{
 if (a.getName()!=null)
 {
  if (c!=null)
  {
   c.setName(a.getName());
  }
 }
}

Левая часть компактней правой?

— Ага.

— А по смыслу такая же?

— Ага.

— То-то и оно. А вот теперь такое же выражение с использованием побитовых операций:

Код Аналог
if (a!=null & a.getName()!=null & c!=null)
{
 c.setName(a.getName());
}
boolean c1 = (a!=null);
boolean c2 = (a.getName()!=null);
boolean c3 = (c!=null);
if (c1)
{
 if (c2)
 {
  if (c3)
  {
   c.setName(a.getName());
 }
 }
}

Т.е. код тот же самый, но абсолютно все вычисления будут проделаны.

Обрати внимание, что если a равно null, то при вычислении c2 будет выкинуто исключение!

— Ага. Теперь картина более ясна.

Комментарии (35)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
SomeBody098 Уровень 51
24 августа 2024
будем знать!
19 мая 2024
Это пригодится вообще???
Denis Odesskiy Уровень 47
26 июля 2024
Да. Иногда требуется проверить всю цепочку условий до конца.
LORD INQUISITOR Уровень 43
1 августа 2024
все зависит от такого куда попадешь, у меня друг в Тинькове работает джуном+, говорит что этим не пользуется
Andrew Karev Уровень 51
9 мая 2024
Новый комментарий спустя 2 года :)
Anonymous #1396846 Уровень 41
4 декабря 2022
В который раз сначала задача, потом теория по ней... ПИздец
22 сентября 2021
Мем страшный - как и ситуация с нашими блогерами.
Лизунов Сергей Уровень 41
17 августа 2021
Лекция понятна, не понятно только, как это использовать. Если нужно проверить соблюдение всех трех условий и использовать &&, то при "провале", например, первой проверки остальные проверять нет смысла (лень). Хотелось бы реальный какой-то пример использования & применительно к boolean.
Ars Уровень 41
13 ноября 2021
Иногда метод что-то делает и возвращает результат операции. Если этот метод будет стоять не первым логических операциях, то он может быть не выполнен, соответственно что-то, что должно было быть сделано - сделано не будет.
LuneFox Уровень 41 Expert
1 декабря 2021
Я использовал это свойство, когда писал игру 2048 здесь на JavaRush. Мне нужно было произвести несколько действий над полем, каждое из которых возвращало какой-то результат, и по итогу выполнения всех этих действий я решал, если на поле произошли изменения - значит, был сделан ход. Если всё осталось на местах - ход не был произведён, можно его не считать. Для этого мне нужно было, чтобы произошли все три действия, плюс состояние, которое я получил к этому моменту. Если бы я использовал здесь ленивые операторы, то часть нужных для игры методов просто не отработала бы.

        for (int i = 0; i < field[0].length; i++) {
            turnMade = (compressRow(field[i]) | mergeRow(field[i]) | compressRow(field[i]) | turnMade);
        }
Короче говоря, операндами у меня стоят методы не просто проверяющие что-то и возвращаюзие результат, но и делающие некоторую полезную работу на этом этапе. При этом один из них выполняется два раза.
li.ch Уровень 41 Expert
4 августа 2022
LuneFox, cпасибо, поняла разницу только благодаря вашему комментарию. Но не уверена, что поняла бы его, если бы раньше сама не писала эту игру.
LuneFox Уровень 41 Expert
4 августа 2022
Кстати мне замечание сделали, что так лучше не писать, и я потом переделал этот кусок. Слишком запутанно читается.
Kurama Уровень 50
4 декабря 2022
Всё понятно, но, пытаясь сделать код компактнее, ты сделал его неочевидным без объяснения
Эли Гутман Уровень 37
15 декабря 2020
Пока не понимаю разницы между первым и вторым случаем. Как это все вычисления в правой части второго случая будут проделаны, если if(c1) даст false, и посему то, что внутри фигурных скобок по идее не должно запускаться.
Agent Smith Уровень 37
26 декабря 2020
Вот этот код (строка 2) будет исполнен независимо от значения переменной с1:

boolean c2 = (a.getName()!=null);
Т. е. если с1 = false (а значит переменная a у нас null), то мы здесь получим исключение. Во втором случае мы сначала вычисляем значения переменных независимо друг от друга, а после этого уже втыкаем их в If-ы. А в первом случае мы сразу вставляем их в if-ы.
Pig Man Уровень 41
4 января 2021
Забей на пример справа, просто знай, что такой код:

if (a!=null && a.getName()!=null && c!=null) {
 c.setName(a.getName());
}
Не выдаст nullpointerexception в проверке a.getName()!=null, потому что "а" уже была проверена в a!=null, и если бы она была null, то дальнейших проверок бы не происходило, так как оператор && вернет true, только если все операнды true, а у нас уже был найден false. Но такой вариант:

if (a!=null & a.getName()!=null & c!=null) {
 c.setName(a.getName());
}
Выдаст nullpointerexception в проверке a.getName()!=null, если а == null (по обратной причине)
Евгений Уровень 47 Expert
18 мая 2020
Т.е. получается, если юзать & вместо &&, то все вычисления в условии будут произведены автоматически, независимо от того, произошло ли соблюдение самого первого (левого) условия?
30 апреля 2020
Рисунок красивый 😂