카테고리 없음

[SQL] 비트 연산

왕초보코딩러 2025. 1. 2. 10:45
728x90

2진수 변환 없이 연산이 가능

SQL에서 숫자를 2진수로 자동 변환하여 연산을 수행하기 때문에 숫자를 2진수로 변환할 필요 없음

https://wing-beat.tistory.com/140

 

[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산

처음에 틀렸던 코드:SELECT ID, EMAIL, FIRST_NAME, LAST_NAMEFROM DEVELOPERSWHERE (BIN(SKILL_CODE) LIKE '%1__________') OR (BIN(SKILL_CODE) LIKE '%1________')ORDER BY ID;처음에는 SKILLCODES 테이블에서 PYTHON, C#의 BIN을 확인한 후 수제

wing-beat.tistory.com

 

 

MySQL 비트 연산자

1. AND (&)

각 위치에서 둘 다 1일 때 1, 나머지는 0

2. OR (|)

각 위치에서 하나라도 1이면 1

3. XOR (^)

각 위치에서 두 비트가 다르면 1, 같으면 0

4. NOT (~)

비트 반전 0이면 1로, 1이면 0으로

 

+ 비트 이동

1. 왼쪽 이동 (<<)

숫자 << 몇 칸 이동

SELECT 5 << 2 AS result;
# 101 << 2 -> 10100 
# |result|
# --------
# |  20  |

 

2. 오른쪽 이동 (>>)

숫자 >> 몇 칸 이동

SELECT 5 >> 2 AS result;
# 101 >> 2 -> 1
# |result|
# --------
# |   1  |

 


문제

https://school.programmers.co.kr/learn/courses/30/lessons/301646#

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

일단 문제를 비트 연산자를 써야 한다고 생각했습니다.

먼저 4번 형질을 제외하고

1~3번 형질 타입은

1, 3 보유만 하면 됨, 2는 보유하면 안 됨

비트로 보았을 때 101, 100, 001이 됩니다.

 

그래서 4번 형질은 모두 있다고 OR 비트 연산을 통해 가정하면(1)

1101, 1100, 1001 이렇게 세 가지 경우가 나올 수 있습니다.

(GENOTYPE | 8)
2진수 10진수
1101 13
1100 12
1001 9

 

 

 

하위 비트는 결정되었는데, 만약 GENOTYPE이 16보다 크다면 비트가 5개 이상이 됩니다.

그러므로 1111과 AND 연산을 해서 하위 4비트만 남깁니다.

(GENOTYPE & 15)

 

이제 SQL문을 작성해보겠습니다.

SELECT COUNT(ID) AS COUNT
FROM ECOLI_DATA
WHERE ((GENOTYPE & 15) | 8) IN (9, 12, 13);
# 하위 4비트만 비교 GENOTYPE & 1111, 4번 제외 1,2,3이 101, 100, 001 이어야 함