位运算符对Java中布尔值的影响

按位运算符应该传送变量并对其进行一点一点的操作。 在整数,长整数的情况下,这是有道理的。 这些变量可以包含由其大小强制执行的全部范围的值。

然而,在布尔值的情况下,布尔值只能包含两个值。 1 =真或0 =假。 但是布尔的大小没有定义。 它可以像字节一样大或稍小一点。

那么在布尔值上使用按位运算符有什么作用? JVM是否将其转化为正常的逻辑运算符并继续前进? 为了操作的目的,它是否将布尔值视为单个位实体? 或者是结果与布尔值的大小一起未定义?


运算符&,^和| 是操作数是原始整数类型时的按位运算符。 当操作数是布尔值时,它们是逻辑运算符,并指定它们在后一种情况下的行为。 有关详细信息,请参阅Java语言规范的第15.22.2节。


使用按位运算符可以避免短路行为:

boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();

如果booleanExpression1()计算结果为false ,那么
booleanExpression2()在第一种情况下不被评估,并且
booleanExpression2()和任何副作用它可以具有)在第二种情况下进行评价


除了其他答案涵盖的内容之外,值得注意的是&&||&|具有不同的优先级 。

从优先级表中提取(在顶部具有最高优先级)。

bitwise AND                 &
bitwise exclusive OR        ^
bitwise inclusive OR        |
logical AND                 &&
logical OR                  ||

这对你意味着什么?

绝对没有什么,只要你坚持只有&| 或者只有&&||

但是,因为| 具有比&&更高的优先权(与|| ,优先权更低),自由混合它们可能会导致意外的行为。

所以a && b | c && d a && b | c && da && (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 (不需要括号)。

链接地址: http://www.djcxy.com/p/15197.html

上一篇: Effect of a Bitwise Operator on a Boolean in Java

下一篇: Fastest way to convert string to integer in PHP