반응형
컴퓨터에서 음수를 표현할 때 가장 많이 쓰는 방식이 2의 보수(2’s complement) 입니다.
🔹 2의 보수를 구하는 방법
예를 들어, 어떤 수를 n비트 정수로 표현한다고 할 때:
- 양수 → 음수 변환 (예: -x)
- 양수 x를 이진수로 표현한다.
- 각 비트를 반전(1→0, 0→1) 시켜서 1의 보수를 만든다.
- 거기에 1을 더하면 → 2의 보수 = 음수 -x의 표현이 된다.
- 음수 → 10진수 변환
- 2의 보수 표현에서 맨 앞 비트(MSB)가 1이면 음수다.
- 다시 모든 비트를 반전하고 +1 하면 원래의 양수 값을 얻는다.
- 그 값에 -를 붙이면 된다.
🔹 예제 (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

'Python > 파이썬 기초 강의(2024)★' 카테고리의 다른 글
파이썬 tkinter: pack(), grid(), place() 위젯 배치 비교 요약 (6) | 2025.08.30 |
---|---|
파이썬, tkinter 위젯 배치하기: place() (1) | 2025.08.28 |
파이썬: tkinter, grid() 이용한 위젯 배치, rowspan columnspan 셀 병합 (합치기) (8) | 2025.08.27 |
tkinter, pack()을 이용한 위젯 배치 (2) | 2025.08.26 |
파이썬, pip: 패키지 및 라이브러리를 설치하고 관리하기 (2) | 2024.12.18 |