Python/파이썬 기초 강의(2024)★

음수, 2의 보수 구하기 파이썬 코드

coding-abc 2025. 9. 10. 11:51
반응형

컴퓨터에서 음수를 표현할 때 가장 많이 쓰는 방식이 2의 보수(2’s complement) 입니다.

🔹 2의 보수를 구하는 방법

예를 들어, 어떤 수를 n비트 정수로 표현한다고 할 때:

  1. 양수 → 음수 변환 (예: -x)
    1. 양수 x를 이진수로 표현한다.
    2. 각 비트를 반전(1→0, 0→1) 시켜서 1의 보수를 만든다.
    3. 거기에 1을 더하면 → 2의 보수 = 음수 -x의 표현이 된다.
  2. 음수 → 10진수 변환
    1. 2의 보수 표현에서 맨 앞 비트(MSB)가 1이면 음수다.
    2. 다시 모든 비트를 반전하고 +1 하면 원래의 양수 값을 얻는다.
    3. 그 값에 -를 붙이면 된다.

🔹 예제 (8비트 기준)

1) -5 구하기

  • +5 → 0000 0101
  • 반전 → 1111 1010
  • +1 → 1111 1011
    👉 따라서 -5 = 1111 1011 (2의 보수)

2) 1111 1011 해석하기

  • MSB=1 → 음수임
  • 반전 → 0000 0100
  • +1 → 0000 0101 (5)
  • 따라서 1111 1011 = -5

👉 즉, 2의 보수 = (모든 비트 반전) + 1

 

 

파이썬 코드

def to_twos_complement(num: int, bits: int) -> str:
    """
    정수를 n비트 2의 보수 표현으로 변환 (이진 문자열 반환)
    """
    if num >= 0:
        # 양수는 그냥 이진수로 채워 넣기
        return format(num, f'0{bits}b')
    else:
        # 음수는 (2^bits + num) 계산
        return format((1 << bits) + num, f'0{bits}b')


def from_twos_complement(bin_str: str) -> int:
    """
    2의 보수 이진 문자열을 10진수 정수로 변환
    """
    bits = len(bin_str)
    value = int(bin_str, 2)
    if bin_str[0] == '1':  # 음수 판별
        value -= (1 << bits)
    return value


# 예시 실행
print("8비트 기준")
print("-5 →", to_twos_complement(-5, 8))   # 11111011
print("5  →", to_twos_complement(5, 8))    # 00000101

print("\n복원하기")
print("11111011 →", from_twos_complement("11111011"))  # -5
print("00000101 →", from_twos_complement("00000101"))  # 5

 

8비트 기준
-5 → 11111011
5  → 00000101

복원하기
11111011 → -5
00000101 → 5

음수, 2의 보수 구하기 파이썬 코드