35

私の質問では例として Java を使用していますが、おそらくすべてに当てはまると思います。

ブール値を比較する場合、XOR 演算子 ( ^Java の場合) と not-equal-to 演算子 ( Java の場合)の間に実際的な違いはありますか?!=

私はここで物事を評価しましたが、不思議に思っていました (奇妙に思えます、2 つのことが等しい)...そしてネット上で何も見つかりませんでした。なんらかのフォーラムでのたった 1 つのディスカッションで、結果が得られずにすぐに終了しました。

4

6 に答える 6

39

ブール値の場合、それらは同じことを意味します-XORには複合代入演算子がありますが、次のようになります。

x ^= y;

不等式に相当する複合代入演算子はありません。

両方が利用できる理由については、不等式と同じように機能するという理由だけでXORが利用できないのは奇妙なことです。論理的にはそこにあるはずなので、そうです。非ブール型の場合、結果は異なる結果タイプであるため結果は異なりますが、それはのXORを削除することが理にかなっているという意味ではありませんboolean

于 2010-11-14T00:31:27.277 に答える
26

Java言語仕様に記載されているように:

オペランドが両方ともtrueまたは両方がfalseの場合、!=の結果はfalseになります。それ以外の場合、結果は真です。したがって、!=は、ブールオペランドに適用された場合、^(§15.22.2)と同じように動作します。

さらに、単純なスニペットのバイトコードを調べてみると、次のようになります。

void test(boolean b1, boolean b2) {
    boolean res1 = b1^b2;
    boolean res2 = b1!=b2;
}

あなたが得る:

test(ZZ)V
   L0
    LINENUMBER 45 L0
    ILOAD 1
    ILOAD 2
    IXOR
    ISTORE 3
   L1
    LINENUMBER 46 L1
    ILOAD 1
    ILOAD 2
    IXOR
    ISTORE 4
   L2
    LINENUMBER 47 L2
    RETURN
   L3

これにより、同じセマンティクスに加えて、実装に実際の実際的な違いがないことが保証されます。(内部的にintがブール値を格納するために使用されていることもわかります)

于 2010-11-14T00:30:46.993 に答える
4

はい、XORを使用してブール値の(不)等式をテストできますが、コードは直感的ではありませif (x ^ y)if (x != y)

于 2010-11-14T00:30:19.440 に答える
3

ブール値では、違いはありません。自分の操作感覚に適した方を選択する必要があります。

例:

bool oldChoice = ...;
bool newChoice = ...;
if (oldChoice != newChoice)
    ...

ここXORでも同じ結果が得られますが、実際のコードの意図は反映されません。

于 2010-11-14T00:30:23.390 に答える
0

この場合、これらは基本的に同じである必要があります。

于 2010-11-14T00:29:44.123 に答える
0

大きな違いがあります。XORはビットレベルで動作し、違いを1つとして保持するため、0b0011 xor 0b1101 => 0b1110

よろしく、// t

于 2010-11-14T00:30:04.733 に答える