출처 : PHPSCHOOL
원본링크 : http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=14353
비트연산 하면 속도만 생각하시는데 꼭 그렇지만은 않습니다.
비트연산은 은근한 매력이 있습니다.
또 응용할 수 있는 곳도 찾아보면 있습니다 ^^;
저의 경우 [ 중복선택 ] 이 필요한 항목에 대해서 주로 비트연산을 사용합니다.
다 아시는 내용이겠지만 그래도 유용하리라 생각하고 적겠습니다.
예)
[ 컴퓨터, 스포츠, 정치, 경제, 여행, 쇼핑, 게임 ]
이렇게 7가지의 항목 중에서 원하는 항목을 중복선택하게 하고
그 결과를 하나의 필드에 저장합니다.
그리고 컴퓨터또는 게임항목을 선택한 사람을 검색한다.
적용)
각 항목에 해당하는 value 값을 비트연산을 사용하기 위해 2의 제곱수로 지정합니다.
비트연산을 사용하기 위한 설계입니다.
컴퓨터는 1 = 2의 0제곱
스포츠는 2 = 2의 1제곱
정치는 4 = 2의 2제곱
...
게임은 64 = 2의 6제곱
물론 항목과 value 값들에 대한 정의 배열은 별도로 만들어놓고 참조하도록 해두어야 겠지요 ^^;
선택값을 넘기는 건 각자 해결이 가능하실 테고...
디비 입력 부분에서는 넘어온 value 값들을 그냥 더해서 하나의 필드에 넣어줍니다.
컴퓨터, 정치, 게임을 선택했다면 1 + 4 + 64 = 69 의 값이 저장됩니다.
물론 정수형 필드면 충분하구요, 정수형 필드일 경우 32가지 항목을 소화할 수 있습니다.
이렇게 하면 무엇을 선택했는지 전혀 알 수 없을 것 같지만 비트연산으로 얼마든지 검출이 가능합니다. (2의 제곱수로 설계를 했기때문에 ^^;)
결과값과 검출하고자 하는 값과의 비트 AND 값이 0이 아닌값(또는 검출하고자 하는 값)이 나오면 선택이 된 것입니다.
만약 컴퓨터또는 게임을 선택한 경우를 검색하고자 한다면 각 value 값의 합인 65 (1 + 64) 와 비트 AND 한 값이 0 이 아닌 경우를 검색하면 됩니다.
select * from 테이블 where 필드&65>0
이런식의 쿼리도 가능합니다.
여러 조합의 검색이 가능합니다.
설명이 허접하네요 ㅜㅜ;;
예전부터 써오던 방법이고 이렇게 쓰시는 분들도 많이 있을 것입니다만,
비트연산의 매력을 소개하고자 올려봅니다. |
|