按位运算符应该遍历变量并逐位操作它们。对于整数、长度和字符来说,这是有意义的。这些变量可以包含由其大小强制执行的全部值。
但是,对于布尔值,布尔值只能包含两个值。1 = 真或0 = 假。但是布尔值的大小没有定义。它可以大到一个字节,也可以小到一个位。
那么在布尔值上使用位运算符的效果是什么呢?JVM 是否实际上将其转换为一个普通的逻辑运算符并继续前进?为了操作的目的,它是否将布尔值视为一个单一的位实体?还是结果与布尔值的大小一起没有定义?
即使它会工作,你不应该这样做。只有当两个操作数都是基元整数类型或者都是布尔类型时,语言规范才定义按位运算符。我想说,对于其他任何情况,结果都没有定义:
Http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
当操作数是不定积分类型时,操作符 &、 ^和 |是按位操作符。当操作数为布尔型时,它们是逻辑运算符,并且在后一种情况下指定了它们的行为。有关详细信息,请参阅 Java 语言规范的第15.22.2节。
&
^
|
使用位运算符可以避免短路行为:
boolean b = booleanExpression1() && booleanExpression2(); boolean b = booleanExpression1() & booleanExpression2();
如果 booleanExpression1()的值为 false,则 在第一种情况下不计算 booleanExpression2(),并且 在第二个病例中评估了 booleanExpression2()(以及它可能产生的副作用),
booleanExpression1()
false
booleanExpression2()
除了其他答案所涵盖的内容之外,值得注意的是,&&和 ||的优先级与 &和 |不同。
&&
||
摘录自 优先级表(在顶部具有最高优先级)。
bitwise AND & bitwise exclusive OR ^ bitwise inclusive OR | logical AND && logical OR ||
这对你意味着什么?
绝对没有,只要你坚持要么只有 &和 |或只有 &&和 ||。
但是,由于 |比 &&具有更高的优先级(相对于优先级较低的 ||而言) ,自由混合它们可能导致意想不到的行为。
所以 a && b | c && d和 a && (b | c) && d是一样的, 而不是 a && b || c && d也就是 (a && b) || (c && d)。
a && b | c && d
a && (b | c) && d
a && b || c && d
(a && b) || (c && d)
为了证明它们是不一样的,我们来看看事实表中的一段摘录:
a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d) F | T | T | T | T | F | T | F | T ^ ^ |- not the same -|
如果希望 OR 的优先级高于 AND,则 可以将同时使用 |和 &&,但不建议这样做。
但是你真的应该把它们放在括号中,以便在使用不同的符号时能够清楚地表示优先级,比如 (a && b) || c(用括号来表示优先级) ,a && b && c(不需要括号)。
(a && b) || c
a && b && c