본문 바로가기

Tech

[기초] Data에 특정 비트들을 넣는 방법

1. AND 연산은 마스크에서 0으로 세팅된 비트들을 지운다.

2. OR 연산은 마스크에서 1로 세팅된 비트들을 넣는다.

3. 특정 비트들을 세팅할 때는 위 방식대로 먼저 클리어하고 넣으면 된다.

 

 

EX) 0x43FC 에서  마스크가 0x3C00 이고 넣고자 하는 값은 0x78 의 상위 4비트일 때.

 

WORD original_data     = 0x53FC ( 0101 0011 1111 1100 )

WORD mask              = 0x3C00 ( 0011 1100 0000 0000 )

BYTE set_data          = 0x78   ( 0111 1000 )                // 상위 4비트 이므로 0111

 

clear_data = original_data & mask;                           // 1번대로 클리어하고 하고

out_data = clear_data | (((WORD)set_data << 6) & mask);      // 2번대로 세팅한다.

 

비트 변화.

 

clear_data                        => 0x43FC ( 0100 0011 1111 1100 )

(WORD)set_data                    => 0x0078 ( 0000 0000 0111 1000 )

(WORD)set_data << 6               => 0x1E00 ( 0001 1110 0000 0000 )

(((WORD)set_data << 6) & mask)    => 0x1C00 ( 0001 1100 0000 0000 )

out_data                          => 0x5FFC ( 0101 1111 1111 1100 )

 

빨간색은 MASK에서 1이 세팅된 위치.

파란색은 set_data의 쉬프트를 보여준다.

 

 

주의점

 

쉬프트 연산을 할 때 형타입에 주의한다.

위의 예에서 BYTE 타입을 그냥 쉬프트하면 상위 비트들이 사라지므로 워드로 캐스팅 하였다.

비트 연산을 할 때 가급적 동일한 사이즈의 형타입으로 진행하자.

위의 예에서는 실무적인 측면을 고려하여 BYTE로 받아 처리하는 것을 보여주었다.