按位运算符应该传递变量并对其进行逐位操作。对于整数,longs,char,这是有意义的。这些变量可以包含由其大小强制的所有值范围。
但是,对于布尔值,布尔值只能包含两个值。1 =真或0 =假。但是没有定义布尔值的大小。它可以大或小。
那么在布尔值上使用按位运算符有什么作用?JVM本质上是否将其转换为普通的逻辑运算符并继续运行?是否出于操作目的将布尔值视为单个位实体?还是未定义结果以及布尔值的大小?
按位运算符应该传递变量并对其进行逐位操作。对于整数,longs,char,这是有意义的。这些变量可以包含由其大小强制的所有值范围。
但是,对于布尔值,布尔值只能包含两个值。1 =真或0 =假。但是没有定义布尔值的大小。它可以大或小。
那么在布尔值上使用按位运算符有什么作用?JVM本质上是否将其转换为普通的逻辑运算符并继续运行?是否出于操作目的将布尔值视为单个位实体?还是未定义结果以及布尔值的大小?
Answers:
运营商&
,^
以及|
是当操作数是原始的整数类型位运算符。当操作数为布尔值时,它们是逻辑运算符,并指定了后者的行为。有关详细信息,请参见Java语言规范的 15.22.2部分。
a || x.foo()
是安全的,如果x是空的,但a | x.foo()
并非如此。|=
遵循与相同的规则|
。
使用按位运算符可以规避短路行为:
boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
如果booleanExpression1()
计算结果为false
,那么
booleanExpression2()
未在第一种情况下,进行评价
booleanExpression2()
(和任何副作用它可以具有)是在第二种情况下评估,
&
会更快,但是使用&&
除了什么是盖在其他的答案,这是值得注意的,&&
并||
有不同的优先级&
和|
。
从优先级表中提取(最高优先级在顶部)。
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
这对您意味着什么?
绝对没有,只要您坚持only &
和|
or only &&
and即可||
。
但是,由于|
优先级高于&&
(相对于||
优先级较低的),因此自由混合它们可能会导致意外行为。
因此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
(不需要方括号)。
即使它可以工作,您也不应该这样做。语言规范仅在两个操作数均为原始整数类型或两个均为布尔类型时才定义按位运算符。我想说,对于其他情况,结果未定义:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228