'masking'에 해당되는 글 1건

  1. 2015.05.24 C/C++ 비트 마스킹의 정리와 응용 4

 비트 마스킹은 다음과 같이 세 가지로 정리된다.

       ❶ 특정 비트를 0으로 만든다. (reset)

       ❷ 특정 비트를 1로 만든다. (set)

       ❸ 특정 비트을 반전시킨다. (toggle)

특정한 비트를 0으로 만들려면 0과 AND연산을 하면 되고 1로 만들려면 1과 OR연산을 하면 된다. 반전시키려면 1과 XOR연산을 취하면 된다. 다음 표에 이것을 정리하였다.

[표 1] 비트 마스크의 종류


x

x&0

0

0

1

0



x

x|1

0

1

1

1



x

x^1

0

1

1

0


이러한 비트 연산 특성을 이용하면 이진수의 특정위치의 비트들을 강제로 1, 0으로 만들거나 혹은 반전시킬 수 있으며 마이크로콘트롤러의 프로그래밍에서 사용빈도가 매우 높은 기법이다.

 비트 이동연산자 << 를 마스킹기법과 조합하여 사용하여 원하는 하나의 비트를 조작하기도 한다. 예를 들어서 unsigned short형 변수 usA가 0xa00b일 때 다른 비트값들은 그대로 유지한 채 8번 비트(b8)만 강제로 1로 만들고 싶다면 다음과 같이 하면 된다.


unsigned short usA = 0xa00b;
usA |= (1<<8);


여기서 (1<<8)의 결과는 이진수로 표시하면 0b 0000 0001 0000 0000 이며 b8만 1로 세트된 데이터이다. 반대로 n번 비트를 0으로 만들고 싶다면 ~(1<<n)과 AND연산을 하면 되고(1<<n 을 반전시켰음에 유의하라), n번 비트를 반전시키려면 (1<<n)과 XOR연산을 취하면 된다.


unsigned short usA = 0xa00b;
usA &= ~(1<<8); //8번 비트만 0으로 만든다


unsigned short usA = 0xa00b;
usA ^= (1<<8); //8번 비트만 반전한다.


 이러한 방법은 특정한 비트가 0인지 1인지를 조건 검사할 경우에도 사용된다. 만약 unsigned char형 변수 ucVar의 6번 비트(b6)가 0인지를 검사하려면 다음과 같이 조건 검사를 하면 될 것이다.


if (ucVar & (1<<6) == 0 ) {
   ...
   // ucVar 의 6번 비트가 0일 경우 수행할 명령들
   ...
} else {
   ...
   // ucVar 의 6번 비트가 1일 경우 수행할 명령들
   ...

}


일반적으로 n번 비트가 0인지를 조사하려면 (1<<n)과 변수와 and연산을 취하여 그 결과가 0인지 검사하면 된다. 이 조건이 거짓이라면 그 비트는 1이라는 결론을 얻을 수 있다.



Posted by 살레시오
,