按位运算符应该传输变量并逐位操作它们。在整数,longs,chars的情况下这是有道理的。这些变量可以包含由其大小强制执行的所有值。
但是,对于布尔值,布尔值只能包含两个值。 1 =真或0 =假。但是没有定义布尔值的大小。它可以大到一个字节或一点点。
那么在布尔值上使用按位运算符会产生什么影响? JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果是否未定义以及布尔值的大小?
答案 0 :(得分:105)
运算符&,^和|当操作数是基本整数类型时,是按位运算符。当操作数是布尔值时,它们是逻辑运算符,并且指定它们在后一种情况下的行为。有关详细信息,请参阅Java Language Specification的第15.22.2节。
答案 1 :(得分:78)
使用按位运算符可以避免短路行为:
boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
如果booleanExpression1()
评估为false
,则为
在第一种情况下不评估booleanExpression2()
,并且
booleanExpression2()
(及其可能产生的任何副作用) 在第二种情况下进行评估,
答案 2 :(得分:18)
除了其他答案所涵盖的内容之外,值得注意的是&&
和||
具有与&
和|
不同的优先级。
摘自the precedence table(最高优先级位于顶部)。
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 | (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
(不需要括号)。
答案 3 :(得分:2)
即使它会起作用你也不应该这样做。语言规范仅在两个操作数都是原始整数类型或两者都是布尔类型时才定义位运算符。我会说,对于任何其他情况,结果都没有定义:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228