布尔逻辑运算符

在Java中, & | ^ 不仅能够运用于整数,还能够运用于布尔值。对于第一种用法称之为整数位运算符(Integer Bitwise Operators),第二种就是即将要介绍的布尔逻辑运算符(Boolean Logical Operators)。我们将布尔值视作一种单比特值,对布尔值运用布尔逻辑运算符的结果与在单个位上进行按位运算是一样的,与条件运算符(Conditional Operators)&& || 的结果也是一样的。区别在于条件运算符可以进行短路操作,而布尔逻辑运算符不会进行短路操作,并且布尔逻辑运算符可以和 = 结合得到 &= |= ^= ,而条件运算符不可以。

JLS 8.0 的 §15.22.2 描述如下:

& ^ | 的两个操作数都是 booleanBoolean 之一时,位运算的结果还是 boolean。在任何情况只要需要就进行自动拆箱(unboxing)§5.1.8 就会发生。

对于 &,如果两个操作数都是 true 结果为 true,否则为 false; 对于 ^,如果连个操作数值不一样结果为 true,相同时为 false; 对于 |,如果两个操作数都是 false 时为 false,否则为 true

Guava Sets.java 中 removeAllImpl 方法用到此用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  /**
   * Remove each element in an iterable from a set.
   */
  static boolean removeAllImpl(Set<?> set, Iterator<?> iterator) {
    boolean changed = false;
    while (iterator.hasNext()) {
      changed |= set.remove(iterator.next());
    }
    return changed;
  }