【C言語】XOR(^)演算子

1. はじめに

排他的論理和、英語はexclusive OR、xorと略されます。

排他的論理和 (xor) は数学演算子です。論理演算で使用されます。XOR の数学記号は「⊕」、コンピューター記号は「xor」です。そのアルゴリズムは次のとおりです。

a⊕b = ( ∧ ∧ b ) ∨ ( a ∧ b )

2 つの値 a と b が同じでない場合、XOR の結果は 1 になります。a と b の値が同じ場合、XOR の結果は 0 になります。

XOR は半加算演算とも呼ばれ、その演算規則はキャリーのない 2 進数の加算と同じで、2 進数では 1 が真、0 が偽を表し、XOR の演算規則は 0⊕0=0, 1⊕0 となります。 = 1、0⊕1=1、1⊕1=0 (同じは 0、差は 1)、これらのルールは加算と同じですがキャリーがないため、XOR はキャリーなしの加算と見なされることがよくあります。

排他的論理和はXOR、EX-ORと略されます。

プログラムには、XOR と ⊕ という 2 つの演算子があります。

それの使い方:

z = x ⊕ y

z = x xor y


2. アルゴリズム

  1. ゼロに戻る法則: a⊕a=0
  2. 恒等法: a⊕0=a
  3. 交換法則: a⊕b=b⊕a
  4. 結合法則: a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c
  5. 再帰: a⊕b⊕a=b
  6. d=a⊕b⊕c から a=d⊕b⊕c を推測できる
  7. x が 2 進数 0101、y が 2 進数 1011 の場合、x⊕y=1110 です。比較される 2 つのビットが異なる場合にのみ結果は 1 になり、それ以外の場合、結果は 0 になります。つまり、「2 つの入力が同じ場合」同じ場合は 0、異なる場合は 1」です。
    ある b a⊕b
    0 0 0
    0 1 1
    1 0 1
    1 1 0

3. ロジック

論理式:F = AB' + A'B

XORロジック図 1 に示します。

写真

その論理シンボル図 2 に示します。

図2

XOR 論理の関係は、AB が異なる場合、出力 P=1、AB が同じ場合、出力 P=0 となります。「⊕」は XOR 演算子の記号です。XOR 論理は AND または非論理の組み合わせでもあります。その論理式は次のとおりです。

P=A⊕B

図 1 からわかるように、XOR 演算のルールは次のとおりです。

0⊕0=0,0⊕1=1

1⊕0=1,1⊕1=0

ヒント 1:

同じ場合は 0、異なる場合は 1 とします。

ヒント 2:

入力 A が 0 の場合、出力 p = 入力 B

入力 A が 1 の場合、出力 p = 入力 B の逆数

実際、英語の XOR の定義はどちらか (is one) であり、両方ではありません。つまり、一方のみが true (1) の場合は true (1) となります。


4. 機能

コンピューターで一般的に使用される排他的論理和 (xor) の論理記号は、一般に xor ですが、⊕ も便利です。

真⊕偽=真

偽⊕真=真

偽⊕偽=偽

真⊕真=偽

または:

真 ⊕ 偽 = 真

偽 ⊕ 真 = 真

偽⊕ 偽 = 偽

真 ⊕ 真 = 偽

一部のコンピューター言語では、true を表すのに 1 を使用し、false を表すのに 0 を使用するため、2 バイトのビットごとの XOR は次のようになります。

00000000

クソ

00000000

-------------

結果

00000000

以下は 2 つのバイナリ値の XOR 計算です。

11111111

クソ

00000000

--------------

結果

11111111

実際には、すべて 10 進数値が使用されるため、2 つの 10 進数値がどのように XOR 演算されるかを見てみましょう。

5 ⊕ 3 = ?

1. XOR 計算の前に、すべての値がバイナリに変換されます。

5 と 3 をバイナリに変換すると、それぞれ 0101、0011 になります。

0101

クソ

0011

--------

結果

0110

2. 結果 0110 を 10 進数に変換します: 6

3.したがって、5 ⊕ 3 = 6


5. 賢い使い方

他の言語とは異なり、C 言語と C++ 言語 (C++ は xor をサポートしており、使用法と効果は '^' と同じです) では xor を使用せず、"^" を使用し、入力方法は Shift+6 です。(他の言語の「^」は一般に力を意味します)

2 つの変数の値を交換する必要がある場合は、交換に一般的に使用される中間変数に加えて、次のように XOR を使用して 2 つの変数のみを交換することもできます。

void swap(int &a,int &b)
{
    a=a^b;
    b=b^a;
    a=a^b;
}

詳細な説明:

a1=a^b
 
b=b^a1=b^a^b=a
//此时a1=a^b  b=a
a=a1^a=a^b^a=b

知らせ:

a=a^b^(b=a);//此类形式是不正确的UB行为,在不同编译器中会有不同的结果,切勿使用

これでaとbの交換は完了です。

要約すると、同じ変数が別の変数と XOR 演算され、その XOR 値は別の数値と等しくなります ((a^b)^b=a など)。

使用例: 暗号化アルゴリズムの 1 つ以上の側面で使用して、アルゴリズムをより複雑にし、解読を困難にし、より安全にすることができます。


6. 加減算との関係

ガロア体の加算と減算の演算は同等です。つまり、XOR 演算です。乗算と除算では、多項式を直接乗算および除算し、原始多項式の剰余を求めます。

おすすめ

転載: blog.csdn.net/weixin_72357342/article/details/132778244