아무거나

[mysql] 비트연산자을 이용한 db 필드를 flexible 하게 관리하는 방법 본문

Data Store/DB

[mysql] 비트연산자을 이용한 db 필드를 flexible 하게 관리하는 방법

전봉근 2019. 4. 10. 18:54
반응형

비트연산자

비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 수행합니다. 또한, 비트 단위로 전체 비트를 좌측이나 우측으로 이동시킬 때도 사용합니다. (연산자 우선순위대로 나열 &가 우선순위 1등)

  • & (AND 연산): 대응되는 비트가 모두 1이면 1을 반환함.
  • | (OR 연산): 대응되는 비트 중에서 하나라도 1이면 1을 반환함.
  • ^ (XOR 연산): 대응되는 비트가 서로 다르면 1을 반환함.
  • ~ (NOT 연산): 비트를 1이면 0으로, 0이면 1로 반전시킴.
  • << (Left Shift 연산): 지정한 수만큼 비트를 전부 왼쪽으로 이동시킴.
  • >> (Right Shift 연산): 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴.

 

[Example]

MySql에서 제공하는 필드의 수는 제한이 있고 필드가 너무 많아지면 관리비용이 늘어납니다. 또한 특정 데이터의 상태 필드가 추가될때마다 서버점검을 해야되는 번거로움이 생깁니다.

 

그것들을 막기위하여 한 필드의 비트연산을해서 여러개의 상태값을 표현할 때 유용하게 쓰입니다. 그러나 통계/집계를 뽑아낼때나 검색이 빈번해서 성능이 중요한 요소라면 정규화 하는 것이 좋다. (ex: 상태값 더할 때는 '|', 상태값을 뺄때는 '&')

 

  // 출력: 8
  // 첫 번째 비트만이 둘 다 1이므로, 연산 결과는 b'1000'이 됨.
  SELECT b'1000' & b'1111';

  // 출력: 15
  // 모든 비트에 하나라도 1이 포함되어 있으므로, 연산 결과는 b'1111'이 됨.
  SELECT b'1000' | b'1111';

  // 출력: 7
  // 첫 번째 비트를 제외한 모든 비트가 서로 다르므로, 연산 결과는 b'0111'이 됨.
  SELECT b'1000' ^ b'1111';

  // 출력: 6
  // 모든 비트를 1비트씩 오른쪽으로 이동시키므로, 연산 결과는 b'0110'이 됨.
  SELECT b'1100' >> 1;

  // 출력: 3
  // 모든 비트를 2비트씩 오른쪽으로 이동시키므로, 연산 결과는 b'0011'이 됨.
  SELECT b'1100' >> 2;

  // 출력: 3
  // 1의 2진수는 001, 2의 2진수는 010 이며 둘의 OR 연산은 011 이므로, 10진수로 변환하면 3이므로 연산 결과는 3이 된다.
  SELECT 1 | 2;

  // 출력: 7
  // 3의 2진수는 11, 4의 2진수는 100 이며 둘의 OR 연산은 111 이므로, 10진수로 변환하면 7이므로 연산 결과는 7이 된다.
  SELECT 3 | 4;

  // 출력: 
  // 15의 2진수는 1111, 12의 2진수는 1100 이며 비트연산자 우선순위의 의하여 12 & 15가 먼저 연산되고 그 후 둘의 XOR 연산은 0011 이므로, 10진수로 변환하면 3이므로 연산 결과는 3이 된다.
  SELECT 15 ^ 12 & 15;

 

위의 'b'를 붙이는 이유는 MySQL에서는 '0'과 '1'로 이루어진 문자열 앞에 'b'를 붙이면 2진수를 표현할 수 있다.

 

    • 10진수 -> 2진수 변환

  • 코드값 예시
// 코드값이 7까지 있을 때
0
1
2
3 (1, 2)
4 
5 (1, 4)
6 (2, 4)
7 (2, 3, 4)


// 코드값이 15까지 있을 때
0 
1  
2 
3 
4 
5 (1, 4)
6 (2, 4)
7 (1, 2, 4)
8 
9 (1, 8)
10 (2,8)
11 (1, 2, 8)
12 (4, 8)
13 (1, 4, 8)
14 (2, 4, 8)
15 (1, 2, 4, 8)
반응형
Comments