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로 받아 처리하는 것을 보여주었다.
'Tech' 카테고리의 다른 글
One Time Coding (0) | 2018.07.24 |
---|---|
[고급] 멀티 쓰레드에서 연속된 데이터 쉐어링 방법 (0) | 2018.07.24 |
[중급] Big Endian 과 Little Endian 의 비교 (0) | 2018.07.24 |
[기초] 각 언어별 문자열 객체 크기 및 배열 구성요소 수 얻기 비교 (0) | 2017.09.13 |
[기초] 포인터와 반복문의 조합 방법 (0) | 2017.09.13 |