C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のBitArrayでビット単位の排他的論理和(XOR)演算を行う方法

C#のBitArrayクラスには、2つのビット配列の対応する要素同士でビット単位の排他的論理和(XOR)演算を実行するためのXor()メソッドが用意されています。この記事では、実際のコード例を通じて、その使い方と動作を詳しく解説します。

XOR演算は、2つのビット値が異なる場合に「true」、同じ場合に「false」を返す論理演算です。例えば、「false」と「true」の組み合わせは「true」になり、「true」と「true」の組み合わせは「false」になります。

サンプルコード1

まずは基本的な例を見てみましょう。以下のコードでは、長さ5の2つのBitArrayを作成し、一部の要素に値を設定した後、Xor()メソッドで排他的論理和を計算しています。

using System;
using System.Collections;
public class Demo {
   public static void Main(){
      BitArray arr1 = new BitArray(5);
      BitArray arr2 = new BitArray(5);
      arr1[0] = false;
      arr1[1] = false;
      arr2[0] = false;
      arr2[1] = true;
      Console.WriteLine("BitArray1 elements...");
      foreach (bool res in arr1){
         Console.WriteLine(res);
      }
      Console.WriteLine("\nBitArray2 elements...");
      foreach (bool res in arr2){
         Console.WriteLine(res);
      }
      Console.WriteLine("\nBitwise exclusive OR operation...");
      IEnumerable demoEnum = arr1.Xor(arr2);
      foreach(Object ob in demoEnum){
         Console.WriteLine(ob);
      }
   }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

BitArray1 elements...
False
False
False
False
False

BitArray2 elements...
False
True
False
False
False

Bitwise exclusive OR operation...
False
True
False
False
False

この結果から、インデックス1の位置で「false」と「true」が異なるため、XOR演算の結果は「true」になっていることがわかります。それ以外の位置では両方の値が同じ(false)なので、結果も「false」になります。

サンプルコード2

続いて、より多くの要素に値を設定した別の例を見てみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main(){
      BitArray arr1 = new BitArray(5);
      BitArray arr2 = new BitArray(5);
      arr1[0] = false;
      arr1[1] = false;
      arr1[2] = false;
      arr1[3] = true;
      arr1[4] = false;
      arr2[0] = false;
      arr2[1] = true;
      arr2[2] = false;
      arr2[3] = true;
      arr2[4] = true;
      Console.WriteLine("BitArray1 elements...");
      foreach (bool res in arr1){
         Console.WriteLine(res);
      }
      Console.WriteLine("\nBitArray2 elements...");
      foreach (bool res in arr2){
         Console.WriteLine(res);
      }
      Console.WriteLine("\nBitwise exclusive OR operation...");
      IEnumerable demoEnum = arr1.Xor(arr2);
      foreach(Object ob in demoEnum){
         Console.WriteLine(ob);
      }
   }
}

実行結果

このコードを実行すると、以下の出力が得られます。

BitArray1 elements...
False
False
False
True
False

BitArray2 elements...
False
True
False
True
True

Bitwise exclusive OR operation...
False
True
False
False
True

結果の解説

各インデックスごとの演算結果を整理すると、次のようになります。

  • インデックス0: false XOR false → false(同じ値)
  • インデックス1: false XOR true → true(異なる値)
  • インデックス2: false XOR false → false(同じ値)
  • インデックス3: true XOR true → false(同じ値)
  • インデックス4: false XOR true → true(異なる値)

このように、Xor()メソッドは呼び出し元のBitArray(arr1)自体を変更し、その結果を返す点にも注意してください。2つの配列の長さが異なる場合はArgumentExceptionがスローされるため、事前に長さを揃えておく必要があります。

  1. C#のBitArrayクラスとは?主なプロパティとIsReadOnlyの使い方を解説

    BitArrayクラスは、ビット(bit)を格納したいものの、必要なビット数が事前にわからない場合に活用できるコレクションクラスです。System.Collections名前空間に属しており、ビット単位でのデータ管理を効率的に行えます。 BitArrayクラスの主なプロパティ C#のBitArrayクラスには、以下のような便利なプロパティが用意されています。 番号プロパティと説明 1CountBitArrayに含まれている要素の数を取得します。 2IsReadOnlyBitArrayが読み取り専用かどうかを示す値を取得します。 3ItemBitArray内の指定した位置にあるビットの値

  2. Pythonのタプルと辞書(dict)の違いとは?特徴と使い分けをわかりやすく解説

    Pythonにはさまざまなデータ構造が用意されていますが、その中でもよく使われるのが「タプル(tuple)」と「辞書(dict)」です。一見どちらも複数のデータをまとめて扱える点で似ていますが、実際にはまったく異なる性質を持つデータ構造です。この記事では、それぞれの特徴と違いをわかりやすく解説します。 タプル(tuple)の特徴 タプルは、複数の要素を順序付きで格納できるデータ構造です。主な特徴は以下のとおりです。 順序が保持される:要素を追加した順番がそのまま維持されます。 イミュータブル(変更不可):一度作成したタプルの要素は、後から追加・削除・変更できません。 任意の型を格納可能:数値