hy30nq's blog
1992 풀이 본문
728x90
https://codeup.kr/problem.php?id=1992
두 수의 합 (More)
첫 번째 줄에 정수 A와 B가 주어진다. (0<=A,B<=2147483647)
codeup.kr
풀이
함수의 작동 방식은 다음과 같습니다:
- 반복 (
while
) 루프:b
가 0이 아닐 때까지 반복합니다.b
가 0이 되면,a
에 최종 합이 저장됩니다. - 캐리 계산:
carry = a & b
는a
와b
의 각 비트에 대해 AND 연산을 수행하여 캐리를 계산합니다. 이 캐리는 두 비트가 모두 1일 때 발생합니다 (이 경우 합산시 다음 자리로 1이 올라가게 됩니다). - 합 계산:
a = a ^ b
는a
와b
에 대해 XOR 연산을 수행하여 각 자리의 합을 계산합니다. XOR 연산은 두 비트가 서로 다를 때만 1을 반환하기 때문에, 캐리 없이 현재 자리의 합을 나타냅니다. - 캐리 이동:
b = carry << 1
은 캐리를 한 자리 왼쪽으로 이동시킵니다. 이는 캐리를 다음 자리로 넘기는 작업에 해당합니다. - 최종 합:
b
가 0이 될 때까지 이 과정을 반복하면,a
에는 두 수의 최종 합이 저장됩니다.
예를 들어, a = 5 (101)
와 b = 3 (011)
의 합을 계산해보겠습니다:
- 첫 번째 반복:
- 캐리:
101 & 011 = 001
- 합:
101 ^ 011 = 110
- 캐리 이동:
001 << 1 = 010
- 캐리:
- 두 번째 반복:
- 캐리:
110 & 010 = 010
- 합:
110 ^ 010 = 100
- 캐리 이동:
010 << 1 = 100
- 캐리:
- 세 번째 반복:
- 캐리:
100 & 100 = 100
- 합:
100 ^ 100 = 000
- 캐리 이동:
100 << 1 = 1000
- 캐리:
- 네 번째 반복:
- 캐리:
000 & 1000 = 000
- 합:
000 ^ 1000 = 1000
- 캐리 이동:
000 << 1 = 000
- 캐리:
b
가 0이 되었으므로, 최종 합은 a = 1000
, 즉 8입니다. 따라서 5와 3의 합은 8이라는 것을 비트 연산으로 계산할 수 있습니다.
답
def add_without_operators(a, b):
while b != 0:
carry = a & b
a = a ^ b
b = carry << 1
return a
input_str = input()
a, b = map(int, input_str.replace(',', ' ').split())
print(add_without_operators(a, b))
728x90