BitArray 클래스는 비트(bit) 값들을 불리언(Boolean) 형태로 저장하는 압축된 배열을 관리하는 컬렉션 클래스입니다. 이때 true는 해당 비트가 켜져 있음(1)을 의미하고, false는 비트가 꺼져 있음(0)을 의미합니다.
BitArray는 메모리를 효율적으로 사용해야 하는 플래그(flag) 관리나 비트 단위 연산이 필요한 상황에서 특히 유용하게 활용됩니다.
BitArray 클래스의 주요 메서드
다음 표는 BitArray 클래스에서 자주 사용되는 메서드들을 정리한 것입니다.
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | public BitArray And(BitArray value); 현재 BitArray의 각 요소와 지정된 BitArray의 대응 요소에 대해 비트별 AND 연산을 수행합니다. |
| 2 | public bool Get(int index); BitArray에서 특정 위치(index)에 있는 비트 값을 반환합니다. |
| 3 | public BitArray Not(); 현재 BitArray의 모든 비트 값을 반전시킵니다. 즉, true는 false로, false는 true로 변경됩니다. |
| 4 | public BitArray Or(BitArray value); 현재 BitArray의 각 요소와 지정된 BitArray의 대응 요소에 대해 비트별 OR 연산을 수행합니다. |
| 5 | public void Set(int index, bool value); BitArray의 특정 위치에 있는 비트를 지정된 값으로 설정합니다. |
| 6 | public void SetAll(bool value); BitArray의 모든 비트를 지정된 값으로 한 번에 설정합니다. |
| 7 | public BitArray Xor(BitArray value); 현재 BitArray의 각 요소와 지정된 BitArray의 대응 요소에 대해 배타적 OR(XOR) 연산을 수행합니다. |
예제 1: BitArray 기본 사용법
다음은 BitArray 객체를 생성하고 요소를 출력한 뒤, Equals 메서드와 IsSynchronized, IsReadOnly 속성을 확인하는 예제입니다.
using System;
using System.Collections;
public class Demo {
public static void Main() {
BitArray arr1 = new BitArray(2);
BitArray arr2 = new BitArray(2);
arr1[0] = false;
arr1[1] = true;
Console.WriteLine("Elements in BitArray1...");
foreach (bool res in arr1) {
Console.WriteLine(res);
}
arr2[0] = false;
arr2[1] = true;
Console.WriteLine("Elements in BitArray2...");
foreach (bool res in arr2) {
Console.WriteLine(res);
}
Console.WriteLine("Is BitArray1 equal to BitArray2? = " + arr2.Equals(arr1));
Console.WriteLine("Is BitArray synchronized? = " + arr2.IsSynchronized);
Console.WriteLine("Is BitArray read-only? = " + arr2.IsReadOnly);
}
}
실행 결과
Elements in BitArray1...
False
True
Elements in BitArray2...
False
True
Is BitArray1 equal to BitArray2? = False
Is BitArray synchronized? = False
Is BitArray read-only? = False
위 결과에서 흥미로운 점은 두 BitArray의 내용이 동일함에도 불구하고 Equals 메서드가 False를 반환한다는 것입니다. BitArray는 Equals를 재정의하지 않으므로 참조(객체) 비교를 수행하기 때문입니다. 또한 BitArray는 기본적으로 스레드 동기화가 적용되어 있지 않으며, 읽기 전용 컬렉션도 아닙니다.
예제 2: XOR(배타적 OR) 연산
다음은 두 BitArray의 요소들 사이에 배타적 OR(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
XOR 연산은 두 비트의 값이 서로 다를 때만 true를 반환합니다. 위 예제에서 인덱스 1의 위치에서는 false와 true가 만나 true가 되었고, 나머지 위치에서는 같은 값(false)끼리 만나 false가 된 것을 확인할 수 있습니다. 이처럼 Xor 메서드를 활용하면 두 비트 배열 간의 차이를 손쉽게 계산할 수 있습니다.