문제 링크
개념
& 연산자
&는 비트 단위 AND연산자다.
정수값을 2진수로 변환한 뒤, 자릿수 기준으로 각 비트를 하나씩 비교하여 결과를 낸다.(길이가 다르면 왼쪽에 0으로 패딩을 준다.) 같은 위치가 두 수 다 1이면 1을 반환하고 아니면 0을 반환한다.
101
& 101
-----
101
1 & 1 → 1
0 & 0 → 0
1 & 1 → 1 0101
& 1101
------
0101
0 & 1 → 0
1 & 1 → 1
0 & 0 → 0
1 & 1 → 1문제에 적용하면…
부모의 형질을 모두 보유한 대장균에 한에 SELECT를 해야한다.
자식의 대장균 관련 데이터 외에도 부모의 대장균의 형질도 SELECT할 때 필요하므로 JOIN을 사용한다.
FROM ECOLI_DATA c
JOIN ECOLI_DATA p
ON c.PARENT_ID = p.ID이제 필요한 데이터는 다 준비되었다.


2진수로 나타냈을 때 같은 값이 나타난다면, 보유한 형질이 같다는 사실을 알 수 있다.
따라서 부모의 형질을 모두 보유했는지의 여부를 확인하려면 자식의 대장균의 형질과 부모의 대장균의 형질을 &연산자로 계산했을 때 부모의 대장균의 형질과 똑같게 나오면 된다.
그리고 문제에서 ID에 대해 오름차순으로 정렬해달라고 했으므로 ORDER BY로 정렬해준다. (기존의 정렬 기준은 다른 컬럼일 수도 있기 때문에 기본값이 오름차순이라고 ORDER BY를 생략해서는 안 된다.)
확장 개념
- |
OR 연산자로, 두 수 같은 자리의 비트가 둘 중 하나라도 1이면 1을 반환하고 아니면 0을 반환한다.
- ^
XOR 연산자로, 두 수 같은 자리의 비트가 서로 다른 값이면 1을 반환하고 아니면 0을 반환한다.
- ~
NOT 연산자로, 하나의 데이터의 비트를 모두 반전시킨다. 1은 0으로, 0은 1로 반전.
SELECT ~3
--------------------
18446744073709552000
=> 컴퓨터 시스템에서 모든 정수는 64비트의 2진수로 표현되므로 3은 00...011이다.
이에 NOT연산자를 사용하면 11...100이 된다.(끝의 두자리만 0이고 나머지 62자리는 1)
이렇게 나온 결과값인 11...100을 10진수로 변환한 것이 위의 결과값이다. - >>(Right shift), <<(Left shift)
모든 비트를 왼쪽, 오른쪽으로 지정된 수만큼 이동시킨다. 이 때, 이동하며 새로 생긴 비트는 0으로 채워진다.
MySQL에서는 0과 1로 이루어진 문자열 앞에 b(bit)를 붙여 2진수를 표현할 수 있다.
ex) b’011’=3, b’110 =6
ex) SELECT B'011' & B'110';
------------------------
2
비트 연산자의 장점
- 빠르다.
: 연산 속도는
비트 연산 > 숫자 연산 > 문자 연산 이는 비트 연산자가 하드웨어 수준에서 지원되기 때문이며, 복잡한 수학 연산보다 훨씬 적은 사이클을 사용한다.
- 메모리를 절약할 수 있다.
: 메모리 사용량이 중요한 임베디드 시스템이나 모바일 어플리케시연에서 유용하다.
- 복잡한 코드를 간결하게 표현할 수 있다.
: 가독성, 관리 측면에서 좋다.
제출 답안
SELECT c.ID, c.GENOTYPE, p.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA c
JOIN ECOLI_DATA p
ON c.PARENT_ID = p.ID
WHERE (c.GENOTYPE & p.GENOTYPE) = p.GENOTYPE
ORDER BY c.ID;참고 자료
Share article