Python - [백준]12813-이진수 연산

Paek·2023년 1월 31일
0

코테공부

목록 보기
15/44

출처

https://www.acmicpc.net/problem/12813

문제

100,000 자리수인 비트연산을 진행하는 기본 문제이다.

접근 방법

  • int(input(),2) = 이진수를 받아와서 십진수로 바꿔준다
  • bin(a & b)[2:] = 이진수의 연산을 진행해준다.
    python에서는 이진수 표현을 0b0001 식으로 앞에 0b가 붙기 때문에 2번째 자리부터 출력해주도록 하였다.
  • .zfill(n): n자리수에 맡게 앞에 0을 붙여준다.
  • 2 ** n - 1 : n자리의 1이 꽉찬 집합이 된다.(마스크)

주의사항

not 연산자 '~'를 그대로 사용하게 되면 안된다.

파이썬 NOT

  • 비트 반전 후, 2의 보수로 만들어서 리턴한다.
    • 비트 반전 -> 1의 보수 -> 2의 보수 -> 음수 부호 붙여서 리턴함

정수형으로 다루기 때문에 저런 과정을 거치는 것 같다. 우리가 원하는 NOT연산은 1의 보수까지이기 때문에 직접 해주어야 한다.

파이썬에서 1의 보수 얻는 방법
(A가 원래 이진수, mask는 A의 자릿수만큼 1로 채운 것)
~A & mask
A ^ mask
mask - A

세가지 방법중 원하는걸 쓰면 된다. 1번째 방법은 자기 자신만 나오지만 파이썬은 형태가 특별하기 때문에 마스크로 and연산만 다시 해주면 1의보수 형태로만 나온다.

코드

a = int(input(), 2)
b = int(input(), 2)
n = 100000
mask = 2 ** n - 1
print(bin(a & b)[2:].zfill(n))
print(bin(a | b)[2:].zfill(n))
print(bin(a ^ b)[2:].zfill(n))
print(bin(a ^ mask)[2:].zfill(n))
print(bin(b ^ mask)[2:].zfill(n))

참고: https://velog.io/@wisepine/BOJ-%EC%9D%B4%EC%A7%84%EC%88%98-%EC%97%B0%EC%82%B0-no.12813

profile
티스토리로 이전했습니다. https://100cblog.tistory.com/

0개의 댓글