Leetcode 371. Sum of Two Integers


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.半加算論理回路図(1ビットのみ)


    ろんりろんり

  • + / -ゲートウェイ:AとBの和を計算
  • XORゲートウェイ:AとBのキャリーを計算(プラス)
  • はんかさんえんざんき

  • 2.電算機

  • ハーフ加算器は1ビットのみで和を計算できるので、複数のハーフ加算器をANDゲートとして計算し、複数ビットの加算を計算することができる.
  • 入力:A,B,Cin(前桁)
    出力:Sum,Coot(そのビット数)
  • 以上のコードの論理ゲート



     

    Reference

  • どうやってコンピューターを計算しますか?ALU編:コンピュータ科学特別講座5
  • 書籍-コードハードウェアとソフトウェアに隠された言語
  • 書籍-Pythonアルゴリズムインタビュー