5

CにXOR論理演算子があるかどうか疑問に思っていました(ANDの&&のようなものですが、XORの場合)。XOR を AND、NOT、OR に分割できることはわかっていますが、単純な XOR の方がはるかに優れています。次に、2 つの条件の間で通常の XOR ビット単位演算子を使用すると、うまくいく可能性があることに気付きました。そして、私のテストではそうでした。

検討:

int i = 3;
int j = 7;
int k = 8;

このややばかげた例のために、kiよりも大きいかjよりも大きい必要があるが、両方ではない必要がある場合、XOR は非常に便利です。

if ((k > i) XOR (k > j))
   printf("Valid");
else
   printf("Invalid");

また

printf("%s",((k > i) XOR (k > j)) ? "Valid" : "Invalid");

ビット単位の XOR ^を入れると、 「無効」が生成されました。2 つの比較の結果を 2 つの整数に入れると、2 つの整数に 1 が含まれるため、XOR は false を生成します。& と | で試してみました。ビット単位の演算子と両方が期待される結果をもたらしました。真の条件はゼロ以外の値を持ち、偽の条件はゼロの値を持つことを知っていれば、これはすべて理にかなっています。

論理的な && と || を使用する理由はあるのでしょうか。ビット演算子 &, | そして^同じように動作しますか?

4

5 に答える 5

13

論理XORは必要ありません。SOの質問を忘れましたが、これはあなたが考えていることと似ています。基本的にXORは必要ありません。とにかく、 !=と同等です。

FALSE XOR FALSE == FALSE
FALSE XOR TRUE == TRUE
TRUE XOR FALSE == TRUE
TRUE XOR TRUE == FALSE


FALSE != FALSE == FALSE
FALSE != TRUE == TRUE
TRUE != FALSE == TRUE
TRUE != TRUE == FALSE

お気に入りを検索して、後でリンクをここに貼り付けます...

于 2010-05-05T12:47:01.607 に答える
11

ビット単位の演算子は、&& および || と「まったく同じ」には機能しません。オペレーター。まず、&& と || です。短絡評価を実行しますが、ビット単位の演算子は実行しません。つまり、ビット演算子では次のようなことはできません。

int * p = 0;
(p != 0) && (*p = 1);

あなたが言った場合:

(p != 0) & (*p = 1);

両方の部分式が評価され、null ポインターを逆参照します。

于 2010-05-05T12:41:29.397 に答える
1

ビット単位のXORは、オペランドが整数値の場合、論理XORのようには機能しません。

2^4 ? "Valid" : "Invalid"

「有効」を与えますが、「無効」を与える必要があります

于 2010-05-05T12:47:28.743 に答える
1

C では、論理演算子の引数はブール値として扱われます。ゼロはすべて「偽」として扱われ、それ以外 (そうです、負の値も) は「真」です。ビット演算は個々のビットで動作し、Neil が既に指摘したように、論理演算のように短絡評価の対象にはなりません。

あなたの例では、2つの間のビット単位がゼロであるため、結果は完全に有効であり、期待されていxorます。

于 2010-05-05T12:50:04.603 に答える
1

C で論理 xor 演算子が必要な場合は、次のように使用できます。

#define xor != 0 ^ !!

式の両側をブール値に変換し、それらを xor することによって機能します。次のように、&& または || を使用しているかのように使用できます。

if (a xor b)

AFAICT、問題はありません。

于 2010-05-30T12:14:02.983 に答える