2011-07-06 4 views
0

BitArray를 사용하여 가장 기본적인 몇 가지 작업을 수행하며 비트가 아닌 비트로 값을 설정하십시오. BitArray라는이 쓰레기를 사용하여 후회하기 시작했습니다.값을 기준으로 비트를 설정하도록 BitArray를 설정하는 방법은 무엇입니까?

내가 이런 비트를 가지고 있다고 해봅시다.

public enum RULE 
{ 
    NOTHING = 0x0, 
    FIRST_STEP = 0x1, 
    FOO_YOU = 0x2, 
    BAR_FOO = 0x10, 
    FOO = 0x20, 
    BAR = 0x40, 
    FOO_BAR = 0x80, 
    READY = 0x100, 
    ...//LOTS MORE BITS 
    FINAL_FLAG_BIT= 0x10000000 //Final bit.. uses the 29th bit. 
}; 

지금 내가 이렇게 말을 ..

//only use 29 bits to save memory, probably still uses 4 bytes lol. 
BitArray rules= new BitArray(29); 

//As you can see what I tried to do. 
public bool ruleEnabled(RULE i) 
{ 
    return rules[(int)i]; //<- this is impossible as it sets BITS not bitmasks. 
} 

public void setRule(RULE rule, bool b) { 
    rules.Set((int)rule, b); 
} 

그래서 나는 그것의 하나는 많은 한계가있어 모르고을 구현 약 30 분 낭비 .. 당신은 그것을 캐스팅 심지어 어떤 방법이 아니라는 것을 알고 그것까지

CopyTo 그래서 난 그냥 1 변수를 사용하여 결국 사용하지 않고 .. 값입니다 만 제대로 작동하려면이 방법 setRuleruleEnabled을 변경했다 (이 솔루션은 모두 깨끗하고 빠른 것 같다).

private int rules; //uses only 29 of the 32 bits. 
public bool ruleEnabled(RULE i) 
{ 
    int bits = (int)i; 
    return (rules & bits) == bits; 
} 

public void setRule(RULE rule, bool set) { 
    if (set) 
     rules |= (int)rule; 
    else 
     rules &= ~(int)rule; 
} 

제 질문은 올바른 것입니까? 왜 BitArray가 유용할까요? 너무 많은 제한이있는 경우 ... 당신은 내가 당신이 더 많은 비트를 처리 할 때 BitArray이 가장 후 모든 데이터 형식 나타낼 수 사용되는 추측 등 ANDORNOTXOR 이미 &|~^

과의 작업을 모두 수행 할 수 있습니다. . 압축/암호화 등.

+0

당신은 지금 꽤 잘 이해하고있는 것 같습니다. –

+0

Meh yeah 나는이 질문을 게시 한 후 BitArray를 완전히 제거했다.하지만이 질문을하는 다른 사람들을 도울 수 있기를 바란다. 그리고 BitArray로 전환하려고하는 사람들에게 도움이되기를 바란다. – SSpoke

답변

0

BitArray는 플래그가 아니라 인덱스에 의해 액세스됩니다. 예를 들어, 길이 29 비트 배열, 유일하게 가능한 인덱스는 0에서 따라서, 다음이 유효 (28)를 통해 범위 :

rules[RULE.READY] = true; // where READY is equal to 0x100, but the 
        // bit array's length is only 29. 

당신은 인덱스에 깃발을 변환해야 의도 한대로 작동하려면 먼저. 다음 함수는 데 도움이 될 수

public static int FlagToIndex(int flag){ 
    int i=0; 
    if(flag==0)return i; 
    while((flag&1)==0){ 
    flag>>=1; 
    i++; 
    } 
    return i; 
} 

을 이제 제대로 인덱스 비트 배열 할 수 있습니다이 기능 :

rules[FlagToIndex((int)RULE.READY)] = true; 

도움이 되었기를 바랍니다.

+0

그것은 루프 haha에가는 많은 것들에 확실하지만 도움이됩니다. – SSpoke

관련 문제