2진법과 컴퓨팅 사고
이 토픽을 마치면
컴퓨터가 왜 2진법을 쓰는지 이해하고, 10진법과 2진법을 변환할 수 있으며, 텍스트와 색상이 내부적으로 어떻게 표현되는지 설명할 수 있습니다.
왜 컴퓨터는 0과 1만 쓰는가
컴퓨터의 핵심 부품인 트랜지스터는 두 가지 상태만 가집니다 — 전류가 흐르거나(1), 흐르지 않거나(0). 수십억 개의 트랜지스터가 모여서 CPU를 구성하고, 각각이 0 또는 1을 표현합니다.
인간은 손가락 10개라서 10진법을 씁니다. 컴퓨터는 상태가 2개라서 2진법을 씁니다. 그렇게 단순합니다.
10진법 vs 2진법
10진법에서 254는:
2 × 10² + 5 × 10¹ + 4 × 10⁰
= 200 + 50 + 4
= 2542진법에서 11111110은:
1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 1×2¹ + 0×2⁰
= 128 + 64 + 32 + 16 + 8 + 4 + 2 + 0
= 254같은 원리입니다. 자릿수마다 10의 거듭제곱 대신 2의 거듭제곱을 곱합니다.
Python으로 변환
# 10진법 → 2진법print(bin(254)) # '0b11111110'print(bin(42)) # '0b101010'
# 2진법 → 10진법print(int('11111110', 2)) # 254print(int('101010', 2)) # 42
# 16진법 (2진법의 축약)print(hex(254)) # '0xfe'print(int('fe', 16)) # 2540b는 2진법, 0x는 16진법을 나타내는 접두사입니다.
비트와 바이트
- 비트(bit): 0 또는 1, 정보의 최소 단위
- 바이트(byte): 8비트 = 1바이트
1 bit → 2가지 값 (0 또는 1)
2 bits → 4가지 값 (00, 01, 10, 11)
3 bits → 8가지 값 (000 ~ 111)
8 bits → 256가지 값 (00000000 ~ 11111111)n비트로 표현할 수 있는 값의 개수는 2ⁿ입니다.
| 단위 | 크기 | 대략적 용도 |
|---|---|---|
| 1 byte | 8 bits | 영문자 1개 |
| 1 KB | 1,024 bytes | 짧은 텍스트 파일 |
| 1 MB | 1,024 KB | 고해상도 사진 1장 |
| 1 GB | 1,024 MB | 영화 1편 (SD) |
| 1 TB | 1,024 GB | 대용량 하드디스크 |
텍스트의 이진 표현 — ASCII와 Unicode
컴퓨터에 "문자"라는 개념은 없습니다. 모든 문자는 숫자에 대응됩니다.
ASCII — 영문자 128개
# 문자 → ASCII 코드print(ord('A')) # 65print(ord('a')) # 97print(ord('0')) # 48print(ord(' ')) # 32
# ASCII 코드 → 문자print(chr(65)) # 'A'print(chr(97)) # 'a'print(chr(48)) # '0''A' = 65 = 01000001 (2진법)
'B' = 66 = 01000010
'a' = 97 = 01100001
'0' = 48 = 00110000ASCII는 7비트로 128개 문자를 표현합니다 — 영문 대소문자, 숫자, 특수문자. 하지만 한국어, 일본어, 중국어는 표현할 수 없습니다.
Unicode — 전 세계 문자
print(ord('가')) # 44032print(ord('한')) # 54620print(hex(ord('가'))) # '0xac00'
print(chr(44032)) # '가'print(chr(127829)) # '🍕' (피자 이모지)
# UTF-8 인코딩 — 바이트 수 확인print('A'.encode('utf-8')) # b'A' — 1 byteprint('가'.encode('utf-8')) # b'\xea\xb0\x80' — 3 bytesprint('🍕'.encode('utf-8')) # b'\xf0\x9f\x8d\x95' — 4 bytesUnicode는 14만+ 문자를 포함합니다. UTF-8은 Unicode를 저장하는 방식으로, 영어는 1바이트, 한국어는 3바이트, 이모지는 4바이트를 사용합니다.
색상의 이진 표현 — RGB
화면의 모든 색상은 빨강(R), 초록(G), 파랑(B) 세 값의 조합입니다. 각 값은 0~255(1바이트).
# RGB 값 → 16진법 색상 코드r, g, b = 255, 128, 0hex_color = f"#{r:02x}{g:02x}{b:02x}"print(hex_color) # #ff8000 (orange)
# 16진법 → RGBhex_str = "ff8000"r = int(hex_str[0:2], 16) # 255g = int(hex_str[2:4], 16) # 128b = int(hex_str[4:6], 16) # 0| 색상 | R | G | B | 16진법 |
|---|---|---|---|---|
| 빨강 | 255 | 0 | 0 | #ff0000 |
| 초록 | 0 | 255 | 0 | #00ff00 |
| 파랑 | 0 | 0 | 255 | #0000ff |
| 흰색 | 255 | 255 | 255 | #ffffff |
| 검정 | 0 | 0 | 0 | #000000 |
CSS에서 #ff8000이라고 쓸 때, 이것은 R=255, G=128, B=0을 16진법으로 표현한 것입니다. 각 채널 8비트 × 3 = 24비트, 약 1,677만 가지 색상을 표현할 수 있습니다.
음수는 어떻게 표현하는가 — 2의 보수
2진법은 0과 1뿐인데, 음수는 어떻게 표현할까요? 컴퓨터는 2의 보수(Two's Complement) 를 사용합니다.
8비트 기준으로 5와 -5를 보면:
5 = 00000101
-5 = 111110112의 보수를 만드는 방법: 모든 비트를 반전(0→1, 1→0)한 뒤 1을 더합니다.
5 = 00000101
반전 = 11111010
+1 = 11111011 → 이것이 -5# Python에서 확인print(bin(5)) # 0b101print(bin(-5 & 0xff)) # 0b11111011 (8비트 기준)
# 2의 보수의 장점: 덧셈 회로 하나로 뺄셈도 가능# 5 + (-5) = 00000101 + 11111011 = 100000000# 9비트째는 버림 → 00000000 = 0 (정확!)이 방식 덕분에 CPU는 별도의 뺄셈 회로 없이, 덧셈 회로만으로 뺄셈을 처리합니다.
8비트 2의 보수로 표현 가능한 범위: -128 ~ +127 (총 256개).
비트 연산 — 0과 1의 직접 조작
프로그래밍에서 비트를 직접 다루는 연산이 있습니다.
a = 0b1100 # 12b = 0b1010 # 10
# AND — 둘 다 1이면 1print(bin(a & b)) # 0b1000 (8)
# OR — 하나라도 1이면 1print(bin(a | b)) # 0b1110 (14)
# XOR — 다르면 1print(bin(a ^ b)) # 0b0110 (6)
# NOT — 반전print(bin(~a & 0xf)) # 0b0011 (3)
# Shift — 비트를 왼쪽/오른쪽으로 밀기print(a << 1) # 24 (12 × 2)print(a >> 1) # 6 (12 ÷ 2)왼쪽 시프트(<<)는 ×2, 오른쪽 시프트(>>)는 ÷2 효과입니다. 곱셈/나눗셈보다 빠르기 때문에, 성능이 중요한 저수준 코드에서 사용됩니다.
실전 — 비트 플래그로 권한 관리
리눅스 파일 권한(chmod 755)이 비트 연산으로 작동합니다.
READ = 0b100 # 4WRITE = 0b010 # 2EXECUTE = 0b001 # 1
# 권한 설정 (OR로 합침)user_perm = READ | WRITE | EXECUTE # 0b111 = 7group_perm = READ | EXECUTE # 0b101 = 5other_perm = READ | EXECUTE # 0b101 = 5
print(f"chmod {user_perm}{group_perm}{other_perm}") # chmod 755
# 권한 확인 (AND로 검사)has_write = bool(user_perm & WRITE) # Truehas_write_g = bool(group_perm & WRITE) # Falsechmod 755의 의미: 소유자(7=rwx), 그룹(5=r-x), 기타(5=r-x). 각 숫자가 3비트의 10진 표현입니다.
핵심 정리
| 개념 | 정리 |
|---|---|
| 2진법 | 0과 1로 모든 숫자를 표현. 컴퓨터의 기본 언어 |
| 비트 | 정보의 최소 단위 (0 또는 1) |
| 바이트 | 8비트. 0~255 범위의 값 |
| ASCII | 영문자를 숫자로 대응 (7비트, 128문자) |
| Unicode | 전 세계 문자 (14만+). UTF-8로 저장 |
| RGB | 색상을 세 값(0~255)으로 표현. 24비트 = 1,677만 색 |
프로그래밍을 하면서 2진법을 직접 계산할 일은 드뭅니다. 하지만 "컴퓨터는 모든 것을 숫자로, 그 숫자를 0과 1로 표현한다"는 사실을 이해하면, 파일 크기, 인코딩 에러, 색상 코드, 비트 플래그 같은 개념이 자연스럽게 와닿습니다. 2의 보수를 이해하면 정수 오버플로가 왜 발생하는지, 비트 연산을 이해하면 권한 시스템(chmod)이 왜 777인지 설명할 수 있습니다.