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 이어야 함