bitArray 를 사용한 Bit Field 기능 구현 - C#

Software/C#|2022. 12. 29. 11:13
반응형

C 언어에는  공용체를 이용한 Bit Field 기능이 있어서 꽤 유용하게 사용했었는데 C#에는 Bit Field 기능이 따로 없어 C#에서 제공되는 bitArray 를 이용하여 Class로 구현해 보았습니다. 

Bit Field 의 경우 입,출력 제어를 위한 I/O Board  제어용으로  요긴하게 사용이 될수 있습니다.

class Bit_Field
{
    private uint byteCount = 0;
    private BitArray bitArray  ;
    //---------------------------------------------------------------------------
    public Bit_Field(uint ByteCount)
    {
        bitArray = new BitArray((int)ByteCount * 8);
        byteCount = ByteCount;
    }
    //---------------------------------------------------------------------------
    public byte Read(uint index)
    {
        if(index >= byteCount) throw new IndexOutOfRangeException();
        else
        {
            byte[] result = new byte[byteCount];
            bitArray.CopyTo(result, 0);
            return result[index];
        }
    }
    //---------------------------------------------------------------------------
    public void Write(uint index, byte data)
    {
        if(index >= byteCount) throw new IndexOutOfRangeException();
        else
        {
            int offset = (int)index * 8 ;

            for(int loop=0 ; loop < 8 ; loop++)
            {
                bitArray[loop + offset] = (data & 0x01) == 1 ? true : false ; 
                data >>= 1;
            }
        }
    }
    //---------------------------------------------------------------------------
    public void SetAll(bool value)
    {
        bitArray.SetAll(value) ;
    }
    //---------------------------------------------------------------------------
    public bool this[int index]
    {
        set => bitArray[index] = value;
        get => bitArray[index];
    }  
}

 

사용방법은 아래와 같이 하시면 됩니다. 

 

Bit_Field bit_Field = new Bit_Field(2);  // 2* 8 = 16bit 용 데이타 

//----- 특정 비트에 값을 넣고 바이트값 불러올 경우 ------------

bit_Field[0] = true;         // 0  비트 값을 설정 
bit_Field[1] = true;         // 1  비트 값을 설정 
bit_Field[2] = true;         // 2  비트 값을 설정 
bit_Field[15] = true;        // 15 비트 값을 설정 

byte lower  = bit_Field.Read(0);   // 하위  8비트 리드 
byte higher = bit_Field.Read(1);   // 상위  8비트 리드 

결과
lower = 0x07
higher = 0x80


//--------- 바이트값을 bit field 에 넣고 값을 비트로 확인할 경우 
bit_Field.Write(0, 0x12) ;
bit_Field.Write(0, 0x34) ;

bool ch1 = bit_Field[0] ;
bool ch2 = bit_Field[1] ;
bool ch3 = bit_Field[2] ;
bool ch16 = bit_Field[15] ;
반응형

댓글()