フッターコンテンツにスキップ
Iron Academy Logo
C#を学ぶ
C#を学ぶ

その他のカテゴリー

C#の2進XOR演算子を理解する

Tim Corey
5 分 54 秒

バイナリ操作はプログラミングの重要な要素であり、特に低レベルの最適化やビット単位の操作を扱う場合に重要です。 そのような操作の1つが排他的論理和(XOR)演算子です。 この記事では、ティム・コーリーのビデオ"The Binary XOR Operator in 10 Minutes or Less."に沿って、C#の2進XOR演算子について説明します。

ティムのビデオは、XOR、その構文、およびその実用的なアプリケーションの優れた内訳です。 以下では、簡単に参照できるように特定のタイムスタンプを参照しながら、彼の説明と例を分析します。

XORの紹介

ティムはビデオの冒頭で、これが"Understanding Binary in C#"シリーズ、特にレッスン番号9の一部であることに触れています。このセッションでは、排他的論理和(XOR)演算子がどのように機能し、さまざまなシナリオでどのように役立つかを説明します。

XOR演算子の構文と基本的な説明

Tim は 2 つの値、1と 2 を導入し、参照用にコンソールに出力します。 彼は、標準的な8ビットのバイナリ表現に焦点を当てるために、32ビット表現を削除しました。

0:31では、XORがC#ではキャレット記号(^)で表されることを説明している。 彼は視聴者に次のように注意を促しています:

  • AND演算子(&)は、両方のビットが1でなければ1を返しません。
  • OR演算子(|) は、ビットの少なくとも1つが1であれば1を返す。
  • XOR演算子(^)は、2つのビットの一方が1の場合のみ1を返しますが、両方は返しません。

ティムはさらに、各ビットの比較ルールを説明しています:

  • 1 排他的論理和 0 = 1
  • 0 排他的論理和 1 = 1
  • 1 排他的論理和 1 = 0
  • 0 排他的論理和 0 = 0

これは、XORが2つの値の間の差分検出器として機能することを意味します。

C#コードでXORを実証する

Timは、uint変数を定義することによって2つの値をXORした結果を保持する実用的な例に移ります。

// Define two sample values
uint val1 = 0b0001;  // 1 in decimal
uint val2 = 0b0010;  // 2 in decimal

// Perform XOR operation between val1 and val2
uint result = val1 ^ val2;

// Print the resultant binary value of XOR operation
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
// Define two sample values
uint val1 = 0b0001;  // 1 in decimal
uint val2 = 0b0010;  // 2 in decimal

// Perform XOR operation between val1 and val2
uint result = val1 ^ val2;

// Print the resultant binary value of XOR operation
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));

そして、結果をコンソールに出力し、出力をメモする:

0000 0011

この出力は、XORが元の値の一方が1であるビットのみを保持し、両方は保持しないことを強調しています。

値の比較に XOR を使用する

ティムは、XORの実用的な使い方の1つ、2つの値が同じかどうかをチェックする方法を示します。

3:00に、彼は値を変更して、val2がまったく同じであるようにします。

// Initialize val1 and val2 to the same value
uint val1 = 0b10011001;
uint val2 = 0b10011001;

// Perform XOR operation to check for identical values
uint result = val1 ^ val2;

// Output will be zero if both values are identical
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
// Initialize val1 and val2 to the same value
uint val1 = 0b10011001;
uint val2 = 0b10011001;

// Perform XOR operation to check for identical values
uint result = val1 ^ val2;

// Output will be zero if both values are identical
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));

彼がXOR演算を実行すると、結果は次のようになる:

0000 0000

ティムは、XORの結果が0であることは、値が同一であることを意味すると説明しています。 これにより、XORは2つの数値が等しいかどうかを比較する迅速な方法となります。

相違を識別するための XOR

4:00に、Timはval2にわずかな違いがある別のケースを示します。 今回、XORはゼロ以外の結果を生成し、値の違いを示します。

XORは1ステップで差異を強調できるため、大きなバイナリ値を効率的に比較する場合にこのアプローチが有効です。

テンポラリ変数なしで 2 つの変数をスワップするための XOR

ティムは、古典的なプログラミングのトリックを紹介します。

5:40に、彼は視聴者に対してval2を追加の変数を宣言せずに入れ替えることに挑戦します。 このソリューションでは、XORを3回使用します:

// Original values
uint val1 = 0b0010; // 2 in decimal
uint val2 = 0b0100; // 4 in decimal

// Swap the values using XOR
val1 = val1 ^ val2;
val2 = val1 ^ val2;
val1 = val1 ^ val2;

// After swap: val1 = 4, val2 = 2
Console.WriteLine($"val1: {val1}, val2: {val2}");
// Original values
uint val1 = 0b0010; // 2 in decimal
uint val2 = 0b0100; // 4 in decimal

// Swap the values using XOR
val1 = val1 ^ val2;
val2 = val1 ^ val2;
val1 = val1 ^ val2;

// After swap: val1 = 4, val2 = 2
Console.WriteLine($"val1: {val1}, val2: {val2}");

彼はそのプロセスを説明します:

  1. val1 ^ val2を格納し、現在は両方の値のミックスを保持していることを意味します。
  2. val1値のみが残ります。
  3. val2値のみが残ります。

7:30に、Timは入れ替えられた値を印刷し、val2が正常に値を交換したことを確認します。

バイナリ表現の XOR を理解する

理解を深めるために、ティムはスワッピング操作のバイナリ・バージョンを実行し、各XORステップがビットにどのような影響を与えるかを示します。 彼は、各ビットが必要なときだけ反転し、XORが値を交換する効率的な方法であることを強調しています。

結論

Tim氏は最後に、核となる要点を強調して締めくくりました:

  • XORは、ちょうど1つのビットが1のときだけ1を返します。
  • 値の比較を効率的に行うために使用できます。
  • これは、3つ目の変数なしで2つの値を入れ替えるのに役立ち、コーディングの課題において便利なトリックになります。

彼は、視聴者がXORを試し、実世界の問題に適用して、より深い理解を構築することを奨励している。

最終的な考え

ティム・コーリーのビデオでは、C#におけるXORを簡潔かつ見事に説明しています。 ステップ・バイ・ステップで例を示すことで、比較、差分、さらには値の入れ替えにおける演算子の有用性を示している。

バイナリ操作やビット単位のトリックに興味があるなら、C# バイナリ操作の理解を深めるために 必見の動画です。

Hero Worlddot related to C#の2進XOR演算子を理解する
Hero Affiliate related to C#の2進XOR演算子を理解する

好きなことを共有することで収入を増やす

.NET、C#、Java、Python、またはNode.jsを使用する開発者向けのコンテンツを作成しますか?あなたの専門知識を副収入に変えましょう!

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね