구조체와 공용체를 사용하면 비트 연산을 상당히 쉽게 할 수 있다.
먼저 구조체를 선언하고 각 멤버를 각 1비트씩 할당 해 준다.
typedef struct _BITS_
{
BYTE bit0:1 ;
BYTE bit1:1 ;
BYTE bit2:1 ;
BYTE bit3:1 ;
BYTE bit4:1 ;
BYTE bit5:1 ;
BYTE bit6:1 ;
BYTE bit7:1 ;
} BITS ;
이제 공용체를 사용해서 1BYTE 공간을 먼저 선언한 BITS라는 1BYTE 구조체와 메모리를 공유하자
typedef union _EBYTE_
{
_EBYTE_( void )
{
m_nByte = NULL ;
ZeroMemory( &m_nBits, sizeof( BITS ) ) ;
};
_EBYTE_( void ) {} ;
BYTE m_nByte ;
BITS m_nBits ;
} EBYTE ;
1 바이트 크기를 갖는 구조체로 같은 메모리 공간을 공유하면 비트 연산이 간편하다.
EBYTE byte1 ;
byte1.m_nByte = 0x47 ;
// 해당 비트값 출력
cout << byte1.m_nBits.bit0 << endl ;
// 해당 비트값을 변경한다.
byte1.m_nBits.bit7 = 1 ;
CString str ;
str.Format( _T("%d"), byte1.m_nByte ) ;
AfxMessageBox( str ) ;
결과는 199가 출력될 것이다.
0x47 = 0100 0111 -> bit7의 값 변경 : 1100 0111 --> 0xC7 : 199 이다.
물론 느리다. 클래스 멤버로 사용하면 빠를지도.