본문 바로가기
Programming/Algorithm

Bitwise operation II

by 작은별하나 2011. 9. 22.
반응형

비트단위 연산자를 많이 사용하는 경우는 깃발 표시방법입니다. 이것을 일반적으로 비트 플래그(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에서 다루었던 나머지 연산입니다.

이와 값이 패킹과 패킹을 푸는 방법을 설명하였습니다.

728x90

'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

댓글