Побитовые операторы (&, 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 будет выкинуто исключение!

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