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

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

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

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

运算符&,^和| 是操作数是基本整数types时的按位运算符。 当操作数是布尔值时,它们是逻辑运算符,在后一种情况下它们的行为是指定的。 有关详细信息,请参阅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)

为了certificate它们不一样,请考虑真值表的摘录:

 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 -| 

如果你想要或者比AND具有更高的优先级,你可以使用|&&在一起,但是这不被推荐。

但是,如果使用不同的符号,即(a && b) || c ,您实际上应该将它们放在方括号中以阐明优先顺序 (a && b) || c (括号来阐明优先级), a && b && c (不需要括号)。

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

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