Given two integers a
and b
, return the sum of the two integers without using the operators +
and -
.
Example 1:
Input: a = 1, b = 2 Output: 3
Example 2:
Input: a = 2, b = 3 Output: 5
Constraints:
-1000 <= a, b <= 1000
class Solution:
def getSum(self, a: int, b: int) -> int:
# 비트마스크 : 음수처리를 위한 비트 설정
MASK = 0xFFFFFFFF
# 정수 최대값(32비트의 MSB는 0값이어야 양수 비트의 최대값이다.)
INT_MAX = 0x7FFFFFFF
# 32비트의 2진수 값 전처리
a_bin = bin(a & MASK)[2:].zfill(32)
b_bin = bin(b & MASK)[2:].zfill(32)
# 비트를 담을 변수 설정
result = []
# carry 설정
carry = 0
# 합계 설정
sum = 0
# 32비트 횟수 만큼 반복문을 돌면서 전가산기 동작 구현
for i in range(32):
# LSB 부터 비트를 본다
A = int(a_bin[31-i])
B = int(b_bin[31-i])
# 각 게이트별 계산
Q1 = A & B
Q2 = A ^ B
Q3 = Q2 & carry
sum = Q2 ^ carry
carry = Q1 | Q3
# 각 비트의 합을 결과값리스트에 추가
result.append(str(sum))
# 마지막 carry(자리올림수)가 남아있으면 결과값에 추가
if carry == 1:
result.append('1')
# 초과된 자리수 비트마스크로 없애버리기(32비트로 가정했으니, 32비트가 넘어가면 안됨)
result = int(''.join(result[::-1]), 2) & MASK
# 음수값이라면 2의보수를 이용하여 음수처리
if INT_MAX < result:
result = ~(MASK ^ result)
return result
class Solution:
def getSum(self, a: int, b: int) -> int:
# 비트 마스크
MASK = 0xFFFFFFFF
# 최대 정수비트
INT_MAX = 0x7FFFFFFF
# 자리 올림수가 0이 아닐때까지 반복
# a = 각비트의 합
# b = 자리가 올려진 carry 값
while b != 0:
a, b = (a ^ b) & MASK, ((a & b) << 1) & MASK
# 음수 처리
if a > INT_MAX:
a = ~(a^MASK)
return a
이 문제는 + / -
연산을 쓰지않고 풀이해야되는 문제로서 비트연산을 써서 풀이해야되는 문제였다.
전가산기의 덧셈을 계산하는 논리 회로도를 구현함으로써 풀이가 되었고 덕분에 컴퓨터가 어떻게 값을 계산하게되는지 알게된 좋은 문제이다.
XOR
게이트 : A와B의 합을 계산AND
게이트 : A와B의 carry(자리올림수) 계산OR
게이트로 계산하여 여러비트의 덧셈을 계산할 수 있다.