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

Dan*_*ham 109 java boolean bitwise-operators

按位运算符应该传输变量并逐位操作它们.在整数,longs,chars的情况下这是有道理的.这些变量可以包含由其大小强制执行的所有值.

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

那么在布尔值上使用按位运算符会产生什么影响呢?JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果未定义以及布尔值的大小?

Noe*_*Ang 112

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

  • 具体来说,&和^和| 是非短路逻辑布尔运算符. (50认同)
  • 这是上面提到的部分的直接链接:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2 (14认同)
  • @Ben,正如@Ken所说,逻辑是非短路的,因此评估第二部分.所以`a || 如果x为null,则x.foo()`是安全的,但是`a | x.foo()`不是.`| =`遵循与`|`相同的规则. (3认同)

mob*_*mob 81

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

boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
Run Code Online (Sandbox Code Playgroud)

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

  • 并且按位操作通常[比短路操作更快](http://stackoverflow.com/a/3076091/94363)(如果评估很简单) (2认同)

Duk*_*ing 19

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

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

bitwise AND                 &
bitwise exclusive OR        ^
bitwise inclusive OR        |
logical AND                 &&
logical OR                  ||
Run Code Online (Sandbox Code Playgroud)

这对你意味着什么?

绝对没有,只要你坚持只&|或只&&||.

但是,由于|具有更高的优先级&&(相反||,优先级较低),自由混合它们可能会导致意外行为.

所以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 -|
Run Code Online (Sandbox Code Playgroud)

如果你想,或有优先级高于AND,你可以使用|&&在一起,但不建议这样做.

但是你真的应该把它们放在括号中,以便在使用不同的符号时澄清优先级,即(a && b) || c(括号以澄清优先权),a && b && c(不需要括号).