Leetcode 371. Sum of Two Integers

Daehwi Kim·2021년 6월 30일
0

LeetCode

목록 보기
21/23

371. Sum of Two Integers

Medium


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

 

풀이

1. 전가산기 구현을 통한 풀이

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
  • 이 문제는 + / - 연산을 쓰지않고 풀이해야되는 문제로서 비트연산을 써서 풀이해야되는 문제였다.

  • 전가산기의 덧셈을 계산하는 논리 회로도를 구현함으로써 풀이가 되었고 덕분에 컴퓨터가 어떻게 값을 계산하게되는지 알게된 좋은 문제이다.

 

전가산기 와 반가산기

1. 반가산기 논리회로도(하나의비트에서만 적용)

논리로직

  • XOR 게이트 : A와B의 합을 계산
  • AND 게이트 : A와B의 carry(자리올림수) 계산

반가산기


2. 전가산기

  • 반가산기로는 하나의 비트에서만 합을 계산할 수 있기때문에 여러반가산기를 OR 게이트로 계산하여 여러비트의 덧셈을 계산할 수 있다.
  • 입력 : A, B, Cin(전의 자리올림수)
    출력 : Sum, Cout(해당 비트의 자리올림수)

위의 코드에서 논리 게이트

 

Reference

profile
게으른 개발자

0개의 댓글