Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# BitArray 요소 간의 비트 배타적 OR(XOR) 연산 구현하기

C#의 BitArray 클래스는 System.Collections 네임스페이스에 포함되어 있으며, 불리언(Boolean) 값을 비트 단위로 관리할 수 있게 해주는 자료구조입니다. 이 글에서는 두 BitArray 객체의 요소들 사이에 비트 배타적 OR(XOR) 연산을 수행하는 방법을 예제와 함께 살펴보겠습니다.

Xor() 메서드란?

BitArray 클래스가 제공하는 Xor() 메서드는 현재 BitArray와 매개변수로 전달된 다른 BitArray의 대응되는 요소들끼리 배타적 OR 연산을 수행합니다. 연산 결과는 현재 BitArray 인스턴스에 그대로 반영되며, 해당 인스턴스를 반환합니다.

배타적 OR 연산의 진리표는 다음과 같습니다.

  • false XOR false → false
  • false XOR true → true
  • true XOR false → true
  • true XOR true → false

즉, 두 비트의 값이 서로 다를 때만 결과가 true가 되고, 같으면 false가 됩니다. 참고로 두 BitArray의 길이가 서로 다르면 Xor() 메서드는 ArgumentException을 발생시키므로, 연산 전에 두 배열의 크기가 동일해야 합니다.

예제 1

다음은 두 개의 BitArray에 대해 비트 배타적 OR 연산을 수행하는 기본적인 예제입니다.

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

첫 번째 BitArray의 모든 요소가 false이므로, XOR 연산 결과는 두 번째 BitArray의 값과 동일하게 나타납니다.

예제 2

이번에는 두 배열 모두 true 값을 포함하고 있는 경우를 살펴보겠습니다.

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() 메서드를 활용하면 두 비트 배열 간의 배타적 OR 연산을 간단하게 처리할 수 있으며, 원본 배열(arr1)에 연산 결과가 직접 저장된다는 점도 함께 기억해두면 좋습니다.