126

位运算符应该移动变量并一点一点地对它们进行操作。在整数、长整数、字符的情况下,这是有道理的。这些变量可以包含由其大小强制执行的所有值范围。

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

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

4

4 回答 4

128

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

于 2009-11-12T18:11:34.267 回答
94

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

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

如果booleanExpression1()评估为false,则
booleanExpression2()在第一种情况下不评估,并且
booleanExpression2()(以及它可能具有的任何副作用)在第二种情况下评估

于 2009-11-12T18:16:59.623 回答
21

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

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

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

这对你意味着什么?

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

但是,由于优先级|高于&&(与 相比||,后者的优先级较低),因此随意混合它们可能会导致意外行为。

Soa && b | c && d是一样的a && (b | c) && d
而不是a && b || c && dwhich would be (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 更高的优先级,则可以|and&&一起使用,但不建议这样做。

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

于 2013-08-22T16:31:45.933 回答
3

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

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

于 2009-11-12T18:10:10.623 回答