비트단위의 논리곱을 이용한 데이터 활용 방법 - 논리곱(and) &
현재 운영중인 시스템에서 비트 연산자를 이용하여 속성 값을 추출하는 로직이 있다.
데이터의 구조가 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바이트 늘려서 저장해도 될 일이다.
'프로그래밍' 카테고리의 다른 글
Thread 생성 비용이 큰 이유 (0) | 2016.04.06 |
---|---|
CronExpression Test 하기 (0) | 2016.03.17 |
jedis returnBrokenResource 메서드에 대한 오해 (0) | 2016.03.09 |
Mybatis 쿼리 로그 출력 (0) | 2016.03.02 |
진수 변환 (0) | 2016.01.26 |
MyBatis 샾(#) 달러($) 차이 (4) | 2016.01.21 |
tag 라이브러리 동작 원리에 대해서 생각해 보자 (0) | 2016.01.18 |
Spring Scoped Proxy Beans (prototype 빈 DI로 주입해서 사용) (0) | 2016.01.14 |