https://school.programmers.co.kr/learn/courses/30/lessons/301646
&연산자의 2진수 자리수 판별 원리
1. 2진수 표현과 AND 연산
AND 연산의 결과는 두 자리 모두 1일 때만 1을 반환한다.
2. 특정 자리 값을 확인하는 마스크 값
마스크 값은 예를 들어,
2진수 0100은 3번째 비트 자리를 확인하기 위한 마스크 값으로 10진수는 4이다.
2진수 1000은 4번째 비트 자리를 확인하기 위한 마스크 값으로 10진수는 8이다.
정수 10은 2진수로 1010이고 여기에 3번째 비트가 1인지 검증할 것이다.
1010
& 0100
-----
0000 (결과: 0 → 3번째 비트는 0)
둘을 & 연산하게 되면 0000으로 0이다. 즉 3번째 비트에 1이 없다는 말이다.
1110
& 0100
-----
0100 (결과: 4 → 3번째 비트는 1)
만약 1110일 때 & 연산을 하면 값이 1이 나올까?
답은 1이 아니라 4이다. 즉 x번째 비트 자리가 있다면 마스크값 x가 결과로 나온다.
좀 더 자세히 설명하면
1 & 0 → 0
1 & 1 → 1
1 & 0 → 0
0 & 0 → 0
각 자리를 비교하므로 0100(2) = 4(10)이 나오게 된다.
여기까지 왔는데도 헷갈린다면 &는 연산자임을 잊어서는 안된다. +, -, *, / 와 같다는 말이다. 즉 1100과 0100의 & 연산결과가 0100(2) = 4(10) 라는 말이다.
3. 결과
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA A
WHERE GENOTYPE & 2 = 0
AND (GENOTYPE&4=1 OR GENOTYPE&1=1)
문제를 이해했다면 위 코드가 어디가 잘못되었는지 파악할 수 있다.