2012-02-07 2 views
13

비트 마스크 및 비트 부울 연산 (XOR/NOR/OR/AND/NOT/EQV/등)을 사용한 연산자 기반 방법을 찾고 있습니다. 일반적으로 나는 과 같은 확장 방법 스타일 접근 방식을 사용하지만,이 경우 조금 혼란 스럽습니다.BitArray 및 XOR

C#에서 비트를 사용하는 더 까다로운 방법이 있습니까? (연산자 과부하 클래스 항 또는 자체 구조체되어야한다) 확장 클래스에 과부하에는 오퍼레이터가 없으므로

 BitArray a = new BitArray(0x001); 
     BitArray b = new BitArray(0x100); 
     BitArray c = new BitArray(0x010); 

     BitArray test = a | b; // won't compile 
     BitArray test2 = a^c; // won't compile 

     BitArray test3 = a.Or(b); // compiles 
     BitArray test4 = a.Xor(c); // compiles 
+3

int를 조작하지 않는 이유는 무엇입니까? int a = 0x001; int b = 0x100; int test = a | 비; 잘 작동합니다. –

+9

[int'를 사용하는 생성자] (http://msdn.microsoft.com/en-us/library/4ty2t3fx.aspx)는 생각하는대로 동작하지 않습니다. – svick

+0

@RobertRouhani이 특정 예제에서 작동하지만 임의의 비트 수는 어떻게됩니까? 예를 들어, 96 비트 정수에 대해 별도의 구조체를 가져야합니다. – annonymously

답변

20

BitArray으로 직접 처리 할 방법이 없지만 항상 BitArray이 포함 된 래퍼 클래스를 만들고 거기에 고유 연산자를 정의 할 수 있습니다. 64 비트 이하로 처리하는 경우, 당신은 그냥 사용할 수 물론

하는 long 또는 ulong과 함께 할 수 ... BitArray로하고이 일을 수있는 방법은 없습니다

+0

또는 32 비트로 내려 가면'BitVector32' 만 사용하십시오. – leppie

+0

@leppie 32 비트라면 가장 쉬운 방법은 표준'int' 또는'uint'를 사용하는 것입니다 – annonymously

+0

@ NOTonymous : 비트 열은 모른다. 초보자의 경우, 특히 마스크 등을 다루는 경우 BitVector32가 더 쉬울 것입니다. – leppie

6

불행히도, 오퍼레이터에 그 방법을 번역하는 실제 방법은 없다. 이것이 미래에 바뀔 것이라는 희망을 (많은 다른 사람들도 마찬가지라고 생각합니다.)하지만 지금은 그렇게 할 방법이 없습니다.

12

좋은 이유 : Or 또는 Xor과 같은 연산은 첫 번째 피연산자을 수정합니다. 그것은 보통 | 또는 ^이 아닙니다.

원하는 경우 작업을 수행하기 전에 첫 번째 피연산자의 값을 복사하는 등 원하는 연산자가 포함 된 래퍼를 만들 수 있습니다.