비트단위의 논리곱을 이용한 데이터 활용 방법 - 논리곱(and) &

프로그래밍|2016. 1. 31. 19:24

현재 운영중인 시스템에서 비트 연산자를 이용하여 속성 값을 추출하는 로직이 있다.

데이터의 구조가 5바이트로 되어 있는데 4번째 바이트를 추출하여 사용하게 되는 구조이다.


4번째 바이트 값을 뽑았을 때 값이 7이라고 가정하자.

7의 값은 비트로 표기하면 다음과 같을 것이다.

00000111


속성들의 값은 다음과 같다.

속성1 = 1

속성2 = 2

속성4 = 4

속성8 = 8


속성1은 비트로 00000001

속성2은 비트로 00000010

속성4은 비트로 00000100

속성8은 비트로 00001000



4번째 바이트의 비트와 속성1 비트를 & 연산자를 이용해 비교하게 되면

00000111 & 00000001 결과 00000001

00000111 & 00000010 결과 00000010

00000111 & 00000100 결과 00000100

00000111 & 00001000 결과 00000000

-> 논리곱(&)은 각 비트를 비교하여 양쪽 모두 1이면 1, 아니면 0을 반환한다.


결론적으로 다음과 같은 조건문으로 해당 속성이 포함되어 있는지를 알 수 있다.

(7 & 속성1) == 속성1 의 결과는 true

(7 & 속성2) == 속성2 의 결과는 true

(7 & 속성4) == 속성4 의 결과는 true

(7 & 속성8) == 속성8 의 결과는 false


이해를 더 쉽게 하기 위해서 웹에서의 활용 방법도 작성해보자.

어떤 광고에 대한 타겟팅 대상을 저장하고자 할 때의 체크박스이다.

<input type="checkbox" name="target" value="1" /> PC

<input type="checkbox" name="target" value="2" /> Android

<input type="checkbox" name="target" value="4" /> IPhone



위의 체크 박스 모두를 선택하고 저장을 할 때 서버에서는 다음과 같이 비트연산자 or를 이용한다.  

-> 논리합(|)은 각 비트를 비교하여 한쪽이라도 1이면 1을 반환한다.

Integer[] ingArr = new Integer[] {1, 2, 4};

               int data = 0;

               for (Integer target : ingArr) {

                       data = data | target;

               }

               System.out.println("data : " + data);

결과값은 7이 나온다.


가져올 때에는 비트단위의 논리곱을 이용하여 타겟팅 대상의 포함 여부를 체크하면 될 것이다.

(00000011 & 00000001) == 00000001 는 true (PC)

(00000011 & 00000010) == 00000010 는 true (Android)

(00000011 & 00000011) == 00000100 는 true (IPhone)


비트를 이용해 속성값을 저장하는 것이 나름 괜찮은 것 같다.

1바이트에 저장되는 비트의 값이 256가지가 되나 위와 같은 방식으로의 속성을 저장할 때에는 각 비트의 수만큼만 저장 가능하다.

즉, 1바이트이면 8개의 속성만 저장가능하다는 것이다.

만약 1바이트로도 부족하다고 생각되면 2바이트, 3바이트 늘려서 저장해도 될 일이다.

댓글()