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

按位运算符应该遍历变量并逐位操作它们。对于整数、长度和字符来说,这是有意义的。这些变量可以包含由其大小强制执行的全部值。

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

那么在布尔值上使用位运算符的效果是什么呢?JVM 是否实际上将其转换为一个普通的逻辑运算符并继续前进?为了操作的目的,它是否将布尔值视为一个单一的位实体?还是结果与布尔值的大小一起没有定义?

67851 次浏览

即使它会工作,你不应该这样做。只有当两个操作数都是基元整数类型或者都是布尔类型时,语言规范才定义按位运算符。我想说,对于其他任何情况,结果都没有定义:

Http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228

当操作数是不定积分类型时,操作符 &^|是按位操作符。当操作数为布尔型时,它们是逻辑运算符,并且在后一种情况下指定了它们的行为。有关详细信息,请参阅 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 && da && (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(不需要括号)。