一个位运算符对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 && d与a && (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