비트연산자 &와 논리연산자 and의 차이점(단축 평가)

1. 비교대상

 

비트연산은 왼쪽 오른쪽 정수들의 비트 단위별로 비교

 

> 5 & 3은 5 = 101이고 3 = 011이고 3개의 비트 각각을 비교해서 결론을 낸다. 

 

1 & 0 = 0, 0 & 1 = 0, 1 & 1 = 1이므로 5 & 3 = 001 = 1이다.

 

논리연산은 불리언 값 True, False끼리 비교

 

> 5 and 3하면 5와 3은 컴퓨터에서 True로 인식하여 결과는 True가 된다

 

 

2. 단축평가

 

논리연산은 단축평가를 한다. 중간에 전체 결론이 확실하게 나면 그 뒤의 연산은 수행하지 않는다.

 

비트연산은 단축평가를 하지 않는다. 반드시 모든 비트 단위들을 비교한다.

 

예를 들어 5 and 0 and 3은 5 and 0 = 0이고 여기서 and 더 해봤자 무조건 0이므로 0 and 3을 평가하지 않는다

 

반면 5 & 0 & 3은 5 & 0 = 0이지만, 0 & 3을 무조건 계산하게 된다.

 

좀 더 구체적으로 비교해보자면..

 

and연산자는 뒤에 f()가 호출이 안되는데

 

 

 

 

5 & 0 & f()는 뒤에 f()가 호출이 되는 모습

 

 

 

 

 

그러면 비트연산은 왜 단축평가를 하지 않는가?

 

논리연산 같은 경우는 True인지 False인지 조건의 결과를 내리는게 목적으로, 조건의 결론이 나면 그 뒤는 굳이 할 필요가 없고

 

비트연산 같은 경우는 수학적인 계산을 위한 연산으로, 중간에 멈추지 않고 끝까지 수학적인 계산 +, *, /등을 하는것과 같다.

 

단축 평가는 최적화 기법이 아니다. 단순히 제어 흐름(control flow)를 위한 장치다.

 

>> 알고리즘적 관점에서 이론적으로 빠르긴한데, 하드웨어 관점에서 고민하는 과정이 있으므로 오히려 느려질 수 있다는거임

 

오히려 평가할지 말지 검사하는 비용보다 단순히 평가하는 비용이 보통은 더 저렴하다.

 

수학적인 계산에서 단축평가를 하면, 수많은 예외를 생각해야하고 오히려 계산이 느려진다.

 

 

3. 계산 결과

 

python 기준으로 논리연산 and or 등은 True, False로 결과를 내는게 아니라, 마지막으로 계산된 객체를 내놓음

 

 

 

 

반면 비트 연산자 & |은 계산 결과를 내놓음

 

 

 

 

 

4. pandas

 

pandas에서 조건식을 이용해 행이나 열을 추출할때, 반드시 비트연산 & |으로 해야함

 

논리연산 and, or 등으로 하면 오류난다

 

 

 

 

 

 

 

students[(students['국어'] >= 80)]을 보면 boolean series 형태로 나온다

 

 

 

 

pandas같은 경우 [False, True, False, True,...] 이렇게 된걸 True인지 False인지 모호하다고 판단함

 

ValueError: The truth value of a Series is ambiguous.

 

물론, python은 리스트가 비어있지 않으면 True로 보는데 pandas는 이렇게 하면 설계상으로 문제 생기니까 이렇게 만듦

 

 

 

 

뭐 아무튼 그래서 students['국어'] >= 80과 students['수학'] >= 80은 각 요소별로 전부 비교해야함

 

이거에 맞는건 각 비트별로 연산하는 비트연산 &를 사용하는게 맞다

 

 

 

728x90