PROBLEM.
https://codeup.kr/problem.php?id=1057
IDEA.
#1056과 동일하게 비트연산자를 이용하여 풀 수 있다. XOR 연산자와 반대의 값을 리턴하면 된다.
TRIAL AND ERROR.
a, b = map(int,input().split())
print(~(a^b))
# 입력 : 0 0
# 출력 : -1
XOR 연산자와 반대인 값을 구해야하기 때문에 a ^ b를 한 후에 ~를 붙여주었는데 답이 틀렸다. 이유가 뭘까?
우리는 ~ (NOT) 연산자 작동방식에 대해 주의해야한다.
16이 이진법으로 1111이라고 해서 ~을 붙였을 때 0000이 된다고 생각하면 안 된다. 컴퓨터는 수 자료형을 8 bit, 16 bit, 32 bit 등으로 표현하기 때문이다. 만약 8bit로 정수를 표현한다고 가정했을 때, 16은 1111₂ 가 아니라 00001111₂이 된다. 따라서 ~ 연산을 하면 11110000₂이 된다.
11110000₂은 첫 자리가 1이기 때문에 음수임을 알 수 있다. 음의 2진수를 10진수로 바꾸는 과정은 다음과 같다.
1) 1은 0으로 0은 1로 바꾼다.
2) 바꾼 2진수에서 1을 더한다.
3) 더한 2진수를 10진수로 바꾼 후 -를 붙인다.
즉, ~ □ = - ( □ +1 )이 된다.
이 문제에서도 a ^ b의 결과값인 0 (=00000000₂)에 대해서 ~ 연산을 하면 11111111₂으로 변환되기 때문에 10진수로 변환하면 -1이 출력된다.
SOURCE.
비트 연산자 ~ 대신 논리연산자 not을 사용하면 내가 원하는 결과를 만들 수 있다. 이때 not 연산자는 결과를 True 혹은 False로 반환하기 때문에 int()를 통해 수 자료형을 바꿔주었다.
a, b = map(int,input().split())
print(int(not(a^b)))
# 입력 : 0 0
# 출력 : 1
LESSON.
비트연산자 ~와 논리연산자 not의 차이를 알 수 있었다.
Reference.
- 비트연산자 (특히 ~ 연산자의 계산방법에 대해서 상세히 설명이 되어있다.)
https://pythonpedia.com/ko/tutorial/730/------
End.
'Algorithm' 카테고리의 다른 글
32nd. CodeUp #1059 : [기초-비트단위논리연산] 비트단위로 NOT 하여 출력하기 (0) | 2020.12.15 |
---|---|
31st. CodeUp #1058 : [기초-논리연산] 둘 다 거짓일 경우만 참 출력하기 (0) | 2020.12.15 |
29th. CodeUp #1506 : [기초-논리연산] 참/거짓이 서로 다를 때에만 참 출력하기 (0) | 2020.12.14 |
이것이 코딩테스트다 chapter12 구현 연습문제 (0) | 2020.12.07 |
이것이 코딩테스트다 Chapter 4 구현 (0) | 2020.12.05 |