[t:/]$ 지식_

구조체와 공용체를 이용해서 비트연산하기

2011/01/08

구조체와 공용체를 사용하면 비트 연산을 상당히 쉽게 할 수 있다.

먼저 구조체를 선언하고 각 멤버를 각 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 이다.

물론 느리다. 클래스 멤버로 사용하면 빠를지도.









[t:/] is not "technology - root". dawnsea, rss