비트 마스킹은 다음과 같이 세 가지로 정리된다.
❶ 특정 비트를 0으로 만든다. (reset)
❷ 특정 비트를 1로 만든다. (set)
❸ 특정 비트을 반전시킨다. (toggle)
특정한 비트를 0으로 만들려면 0과 AND연산을 하면 되고 1로 만들려면 1과 OR연산을 하면 된다. 반전시키려면 1과 XOR연산을 취하면 된다. 다음 표에 이것을 정리하였다.
[표 1] 비트 마스크의 종류 | ||||||||||||||||||||
|
|
|
이러한 비트 연산 특성을 이용하면 이진수의 특정위치의 비트들을 강제로 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이라는 결론을 얻을 수 있다.
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
C/C++ 배열의 선언과 초기화 (part 2 / 2) (0) | 2015.05.26 |
---|---|
C/C++ 배열의 선언과 초기화 (part 1 / 2) (0) | 2015.05.26 |
C/C++ 자료형 연습문제 (3) | 2015.05.24 |
C/C++ 의 typedef 명령어 (1) | 2015.05.24 |
C/C++ printf()함수의 기본적인 사용법 (0) | 2015.05.24 |