비트단위 연산자를 많이 사용하는 경우는 깃발 표시방법입니다. 이것을 일반적으로 비트 플래그(Bit flag)라고 합니다. 비트 플래그는 윈도즈 프로그램을 하다보면 아주 쉽게 찾아볼 수 있는데, 사용법도 간단해서 쉽게 이용할 수 있습니다.
비트 플래그는 각각의 비트가 1인 경우에는 플래그가 켜진 것으로, 0인 경우에는 플래그가 내려간 것으로 생각합니다. 빨간 깃발과 파란 깃발을 정의해서 해보도록 할께요.
빨간 깃발은 Bit 0 을, 파란 깃발은 Bit 1 을 차지하고 있습니다. 이것을 비트 연산으로 처리한다면, 다음과 같이 할 수 있습니다. 비트 플래그들은 모두 2의 멱승으로 구성됩니다. 추후 패킹에서는 보다 일반적인 방법을 설명하겠지만요.
RedFlag = 1, BlueFlag = 2
1) 빨간 깃발 올림 : Flag = Flag | RedFlag
2) 빨간 깃발 내림 : Flag = Flag & ~RedFlag
3) 파란 깃발 올림 : Flag = Flag | BlueFlag
4) 파란 깃발 내림 : Flag = Flag & ~BlueFlag
5) 빨간 & 파란 깃발 올림 : Flag = Flag | RedFlag | BlueFlag
6) 빨간 & 파란 깃발 내림 : Flag = Flag & ~(RedFlag | BlueFlag)
이와 같이 우리는 손쉽게 비트 단위 연산자로 깃발을 올리거나 내릴 수 있습니다. 마찬가지로 깃발을 검사하는 것 역시 & 연산자를 이용하여 손쉽게 구현할 수 있습니다.
1) 빨간 깃발 검사 : Flag & RedFlag
2) 파란 깃발 검사 : Flag & BlueFlag
이것을 더 확장하면 우리는 패킹이라는 것을 이용할 수 있습니다. C 언어에는 struct 키워드를 이용하여 비트필드 구조체를 만들 수 있습니다만, 보다 일반적으로 사용하고자 하신다면, 비트필드 구조체보다는 바로 비트 단위 연산자를 사용할 것을 권합니다.
예를 들어서 날짜를 표시하도록 합니다. 날짜를 표시하는 데 있어서 비트수를 가장 적게 차지하는 방법은 기준날짜로부터의 날 수를 사용하는 것이지만, 이 경우 계산이 복잡하게 되겠죠. 여기서는 간단하게 패킹을 이용해서 데이터를 만들어보도록 합니다.
yyyy 년 mm 월 dd 일로 표시하고자 합니다. 연도는 최대 9999년까지 표시하도록 하고요. 월, 일은 우리가 알고 있다시피 12와 31이 최대 숫자가 됩니다. 이런 경우 각각의 비트수는 년도가 14비트, 월이 4비트, 일이 5비트가 됩니다. 총 23비트로 우리는 32비트 자료형에 넣을 수 있겠네요.
date = (yyyy << 9) | (mm << 5) | dd
그러면 이 숫자를 반대로 연월일로 복귀할려면 어떻게 할까요?
yyyy = date >> 9, mm = (date >> 5) & 15, dd = date & 31
자 이렇게 하면 연월일로 다시 환원할 수가 있습니다. & 15, & 31 은 제가 비트 단위 연산 I에서 다루었던 나머지 연산입니다.
이와 값이 패킹과 패킹을 푸는 방법을 설명하였습니다.
'Programming > Algorithm' 카테고리의 다른 글
Bitwise operation IV (0) | 2011.09.26 |
---|---|
Bitwise operation III (0) | 2011.09.23 |
Bitwise operation I (0) | 2011.09.21 |
수, 거듭제곱, 로그 (0) | 2011.09.21 |
수, 거듭제곱, 로그 (0) | 2011.09.21 |
댓글