2022. 12. 24. 10:56ㆍ프로그래밍/Python
안녕하세요, 오늘은 파이썬의 흥미로운 연산에 대해 알아보려고 합니다.
파이썬은 언어의 개발이념 자체가 명시성을 강조하기때문에, 근래에 개발된 프로그래밍 언어중에서도 인간의 언어와 가장 비슷하다는 특징을 가지고 있습니다.
또 다른 특징으로는 데이터의 형변환, 연산자의 연산 범위가 다양하다는 특징이 있는데요,
그래서 오늘 알아볼 "&"연산자 또한, "and" 라는 형태로도 연산이 가능합니다.
그래서 이 둘이 완전히 같은거냐?라고 물으신다면, 대답은 "No" 입니다.
한번 자세히 알아 보겠습니다.
다음의 실행 결과는 어떨지 예상이 되시나요?
a 와 b 의 타입은 int라는 것은 파이썬 문법을 공부하신 분들이라면 쉽게 예상 하실 수 있었을 것 입니다.
이글을 읽으시는분들은 "(a and b) > 0" 과 "(a&b) > 0"의 연산값은 아는데, 그 과정이 헷갈려서 오신 분들이 많으 실 거라고 생각합니다.
결론 먼저 말씀드리자면 전자는 True 후자는 False 로 서로 다른 값을 리턴 합니다.
1. "(a and b) > 0"
- 이건 당연히 " a > 0 " & "b > 0" 이니까 True 아니야? 네, 아닙니다. "드모르간의 법칙"이 적용되어 그렇게 된다면, 참 좋겠지만 안타 깝게도 파이썬에서는 다른 방식으로 동작합니다. and 연산자의 피연산자에, 논리값이 존재한다면 논리곱을 리턴하지만, 두 수가 주어진경우 and는 max(a,b)로 동작하게 됩니다. 따라서 "max(a,b) > 0" 이 되기 때문에 True 인것 입니다.
2. "(a&b) > 0"
- and 와 & 연산은 같다고, 파이썬을 공부하며 배웠습니다. 네, 이것도 피연산자들이 논리값일 때는 참인 명제이지만, 피연산자가 정수로 주어진다면, 이 둘은 전혀 다른 방식으로 동작하게 됩니다. & 연산자에 두 정수가 피연산자로 주어질 경우, 피 연산자 값을 이진수로 변환하여, 각 비트를 곱연산 하게됩니다. 1 이 True, 0 이 False 의 값을 가지고있으니, 각 비트의 0 이 존재한다면 0 으로 덮어쓴다고 생각을하셔도 좋습니다. 또는 두 수를 이진곱한 결과로 생각하셔도 됩니다. (이진수의 곱셈에 대해서는 "이산수학(Discrete Mathematics)"에서 배우게 됩니다.)
1은 이진수로 표기시 "1" (편의상 "01"), 2는 이진수로 표기시 "10"
따라서 연산은
1 0
& 0 1
0 0
의 과정을 거치게 되고, "00" 은 십진법 표기시 0 이기때문에, 0 과 같음으로 False를 리턴하게 되는 것 입니다.
요약 : and 에 피연산자로 숫자가 주어질경우 max 로 동작, & 에 피연산자가 정수로 주어질 경우 두 숫자를 이진법으로 변환하여, 각비트를 논리곱으로 연산