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


118

按位运算符应该传递变量并对其进行逐位操作。对于整数,longs,char,这是有意义的。这些变量可以包含由其大小强制的所有值范围。

但是,对于布尔值,布尔值只能包含两个值。1 =真或0 =假。但是没有定义布尔值的大小。它可以大或小。

那么在布尔值上使用按位运算符有什么作用?JVM本质上是否将其转换为普通的逻辑运算符并继续运行?是否出于操作目的将布尔值视为单个位实体?还是未定义结果以及布尔值的大小?


1
我认为您不能在布尔值上使用按位运算符。仅在数字上。我确定〜不会起作用,我不知道其他运算符。
Martijn Courteaux,2009年

4
您可以使用其中的一些,我们刚刚发现了| 在我们的旧版代码中使用。我们正在删除它,但是此代码已编译并正常工作。
丹尼尔·宾汉

9
由于一个短路,而另一个则不短路(请参阅mobrule的答案),因此在更改| 到|| 您可能要确保后续的布尔表达式没有原始程序员打算始终执行的任何副作用。
John M Gant

Answers:


122

运营商&^以及|是当操作数是原始的整数类型位运算符。当操作数为布尔值时,它们是逻辑运算符,并指定了后者的行为。有关详细信息,请参见Java语言规范的 15.22.2部分。


57
具体来说,&和^和| 是非短路逻辑布尔运算符。

14
这是上述部分的直接链接:docs.oracle.com/javase/specs/jls/se7/html/…–
Andy Thomas

如果上述情况成立,为什么ideone.com/oGSF7c会引发空指针异常?如果|=运算符是逻辑运算符,则程序永远不应运行该x.getValue()指令。
ikromm'2

1
@JohnKrommidas,您的x为null,这就是为什么您得到NullPointerException的原因。您需要实例化它。
2015年

4
@Ben,正如@Ken所说,逻辑是非短路的,因此第二部分将被评估。所以a || x.foo()是安全的,如果x是空的,但a | x.foo()并非如此。|=遵循与相同的规则|
迈克尔·史密斯

86

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

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

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


2
而且按位运算的执行速度通常比短路运算的执行速度快(假设评估很简单)
rds

1
按位操作&会更快,但是使用&&
NatNgs

20

除了什么是盖在其他的答案,这是值得注意的,&&||有不同的优先级&|

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

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(不需要方括号)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.