126

ビット単位の演算子は、変数を移動し、ビットごとに操作することになっています。整数、long、charの場合、これは理にかなっています。これらの変数には、サイズによって適用されるすべての値を含めることができます。

ただし、ブール値の場合、ブール値には2つの値しか含めることができません。1=真または0=偽。ただし、ブール値のサイズは定義されていません。1バイト程度の大きさでも、少し小さい大きさでもかまいません。

では、ブール値に対してビット演算子を使用するとどのような影響がありますか?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()に評価される場合、最初のケースで評価されず、2番目のケースでは(およびそれが持つ可能性のある副作用が何であれ)評価されfalseます。
booleanExpression2()
booleanExpression2()

于 2009-11-12T18:16:59.623 に答える
21

他の回答でカバーされているものを超えて、それは注目に値し、と&&||は異なる優先順位を持っています。&|

優先順位テーブルから抽出します(最優先順位が一番上になります)。

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 | (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 に答える