Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Algorithm

30th. CodeUp #1057 : [기초-논리연산] 참/거짓이 서로 같을 때에만 참 출력하기

Kellyyyy 2020. 12. 14. 21:52

PROBLEM.

https://codeup.kr/problem.php?id=1057

 

[기초-논리연산] 참/거짓이 서로 같을 때에만 참 출력하기

C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요.  - 모든 내용

codeup.kr

 


IDEA.

#1056과 동일하게 비트연산자를 이용하여 풀 수 있다. XOR 연산자와 반대의 값을 리턴하면 된다.


TRIAL AND ERROR.

a, b = map(int,input().split())
print(~(a^b))

# 입력 : 0 0
# 출력 : -1

XOR 연산자와 반대인 값을 구해야하기 때문에 a ^ b를 한 후에 ~를 붙여주었는데 답이 틀렸다. 이유가 뭘까?

우리는 ~ (NOT) 연산자 작동방식에 대해 주의해야한다. 

 

NOT 연산자 TCP SCHOOL.COM

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/------

 

비트 연산자 | Python Language Tutorial

비트 연산자 | Python Language Tutorial

pythonpedia.com

End.