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

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

Открыта
Побитовые операторы (&, 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)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Валихан
Уровень 33
Expert
18 февраля 2025, 07:29
SomeBody098веник в бане
24 августа 2024, 11:55
будем знать!
19 мая 2024, 08:42
Это пригодится вообще???
Denis Odesskiy Full Stack Developer
26 июля 2024, 12:57
Да. Иногда требуется проверить всю цепочку условий до конца.
LORD INQUISITOR
Уровень 43
1 августа 2024, 13:44
все зависит от такого куда попадешь, у меня друг в Тинькове работает джуном+, говорит что этим не пользуется
Andrew Karev
Уровень 51
9 мая 2024, 18:54
Новый комментарий спустя 2 года :)
Anonymous #1396846
Уровень 41
4 декабря 2022, 10:32
В который раз сначала задача, потом теория по ней... ПИздец
22 сентября 2021, 18:31
Мем страшный - как и ситуация с нашими блогерами.
17 августа 2021, 13:09
Лекция понятна, не понятно только, как это использовать. Если нужно проверить соблюдение всех трех условий и использовать &&, то при "провале", например, первой проверки остальные проверять нет смысла (лень). Хотелось бы реальный какой-то пример использования & применительно к boolean.
Ars
Уровень 41
13 ноября 2021, 12:19
Иногда метод что-то делает и возвращает результат операции. Если этот метод будет стоять не первым логических операциях, то он может быть не выполнен, соответственно что-то, что должно было быть сделано - сделано не будет.
LuneFoxJava Developer в BIFITExpert
1 декабря 2021, 01:48
Я использовал это свойство, когда писал игру 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, 19:18
LuneFox, cпасибо, поняла разницу только благодаря вашему комментарию. Но не уверена, что поняла бы его, если бы раньше сама не писала эту игру.
LuneFoxJava Developer в BIFITExpert
4 августа 2022, 21:02
Кстати мне замечание сделали, что так лучше не писать, и я потом переделал этот кусок. Слишком запутанно читается.
Kurama
Уровень 50
4 декабря 2022, 20:09
Всё понятно, но, пытаясь сделать код компактнее, ты сделал его неочевидным без объяснения
Эли Гутман
Уровень 37
15 декабря 2020, 20:25
Пока не понимаю разницы между первым и вторым случаем. Как это все вычисления в правой части второго случая будут проделаны, если if(c1) даст false, и посему то, что внутри фигурных скобок по идее не должно запускаться.
Agent Smith
Уровень 37
26 декабря 2020, 18:34
Вот этот код (строка 2) будет исполнен независимо от значения переменной с1:
boolean c2 = (a.getName()!=null);
Т. е. если с1 = false (а значит переменная a у нас null), то мы здесь получим исключение. Во втором случае мы сначала вычисляем значения переменных независимо друг от друга, а после этого уже втыкаем их в If-ы. А в первом случае мы сразу вставляем их в if-ы.
Pig ManГлавная свинья в Свинарнике
4 января 2021, 12:23
Забей на пример справа, просто знай, что такой код:
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 (по обратной причине)
ЕвгенийBackend Developer в AmwayExpert
18 мая 2020, 18:04
Т.е. получается, если юзать & вместо &&, то все вычисления в условии будут произведены автоматически, независимо от того, произошло ли соблюдение самого первого (левого) условия?
30 апреля 2020, 16:15
Рисунок красивый 😂