java除法小數點 位運算符對Java中布爾值的影響




java除法小數點 (4)

即使它會起作用,你也不應該這樣做。 只有當兩個操作數都是原始整數類型或兩者都是布爾類型時,語言規範才定義按位運算符。 我會說任何其他情況下的結果沒有定義:

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

按位運算符應該傳送變量並對其進行一點一點的操作。 在整數,長整數的情況下,這是有道理的。 這些變量可以包含由其大小強制執行的全部範圍的值。

然而,在布爾值的情況下,布爾值只能包含兩個值。 1 =真或0 =假。 但是布爾的大小沒有定義。 它可以像字節一樣大或稍小一點。

那麼在布爾值上使用按位運算符有什麼作用? JVM是否將其轉化為正常的邏輯運算符並繼續前進? 為了操作的目的,它是否將布爾值視為單個位實體? 還是結果與布爾值的大小一起未定義?


運算符&,^和| 是操作數是原始整數類型時的按位運算符。 當操作數是布爾值時,它們是邏輯運算符,並指定它們在後一種情況下的行為。 有關詳細信息,請參閱Java語言規範的第15.22.2節。


除了其他答案涵蓋的內容之外,值得注意的是&&||&|具有不同的優先級 。

優先級表中提取(在頂部具有最高優先級)。

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)

為了證明它們不一樣,請考慮真值表中的摘錄:

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 (括號來闡明優先級), a && b && c (不需要括號)。


使用按位運算符可以避免短路行為:

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

如果booleanExpression1()計算結果為false ,那麼
booleanExpression2()在第一種情況下不被評估,並且
在第二種情況下評估booleanExpression2() (以及它可能產生的任何副作用)





bitwise-operators