位运算符应该移动变量并一点一点地对它们进行操作。在整数、长整数、字符的情况下,这是有道理的。这些变量可以包含由其大小强制执行的所有值范围。
然而,在布尔值的情况下,一个布尔值只能包含两个值。1 = 真或 0 = 假。但是布尔值的大小没有定义。它可以大到一个字节,也可以小到一点。
那么在布尔值上使用按位运算符有什么影响?JVM 是否本质上将其转换为普通的逻辑运算符并继续前进?出于操作的目的,它是否将布尔值视为单个位实体?还是结果与布尔值的大小一起未定义?
位运算符应该移动变量并一点一点地对它们进行操作。在整数、长整数、字符的情况下,这是有道理的。这些变量可以包含由其大小强制执行的所有值范围。
然而,在布尔值的情况下,一个布尔值只能包含两个值。1 = 真或 0 = 假。但是布尔值的大小没有定义。它可以大到一个字节,也可以小到一点。
那么在布尔值上使用按位运算符有什么影响?JVM 是否本质上将其转换为普通的逻辑运算符并继续前进?出于操作的目的,它是否将布尔值视为单个位实体?还是结果与布尔值的大小一起未定义?
当操作数是原始整数类型时,运算符 、 和 是按位运算&
符^
。|
当操作数是布尔值时,它们是逻辑运算符,并且它们在后一种情况下的行为是指定的。有关详细信息,请参阅Java 语言规范的第 15.22.2 节。
使用按位运算符可以规避短路行为:
boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
如果booleanExpression1()
评估为false
,则
booleanExpression2()
在第一种情况下不评估,并且
booleanExpression2()
(以及它可能具有的任何副作用)在第二种情况下评估,
除了其他答案中涵盖的内容之外,值得注意的是,它的优先级与and&&
不同。||
&
|
从优先级表中提取(最高优先级在顶部)。
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
这对你意味着什么?
绝对没有,只要你坚持只&
和|
或只&&
和||
。
但是,由于优先级|
高于&&
(与 相比||
,后者的优先级较低),因此随意混合它们可能会导致意外行为。
Soa && b | c && d
是一样的a && (b | c) && d
,
而不是a && b || c && d
which would be (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 更高的优先级,则可以将|
and&&
一起使用,但不建议这样做。
但是你真的应该把它们放在括号中,以在使用不同符号时澄清优先级,即(a && b) || c
(括号来澄清优先级),a && b && c
(不需要括号)。
即使它会起作用,你也不应该这样做。仅当两个操作数都是原始整数类型或两者都是布尔类型时,语言规范才定义按位运算符。我会说对于任何其他情况,结果都没有定义:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228