BioPlayground

🧬
목록으로

2진법과 컴퓨팅 사고

컴퓨터가 왜 0과 1만 쓰는지, 비트와 바이트의 의미, 텍스트와 색상의 이진 표현을 이해합니다.

입문
|
10
|
검증 완료 (2026-07)
2진법비트바이트이진수컴퓨터 표현
진행률0/8 (0%)

2진법과 컴퓨팅 사고

이 토픽을 마치면

컴퓨터가 왜 2진법을 쓰는지 이해하고, 10진법과 2진법을 변환할 수 있으며, 텍스트와 색상이 내부적으로 어떻게 표현되는지 설명할 수 있습니다.


왜 컴퓨터는 0과 1만 쓰는가

컴퓨터의 핵심 부품인 트랜지스터는 두 가지 상태만 가집니다 — 전류가 흐르거나(1), 흐르지 않거나(0). 수십억 개의 트랜지스터가 모여서 CPU를 구성하고, 각각이 0 또는 1을 표현합니다.

인간은 손가락 10개라서 10진법을 씁니다. 컴퓨터는 상태가 2개라서 2진법을 씁니다. 그렇게 단순합니다.


10진법 vs 2진법

10진법에서 254는:

text
2 × 10² + 5 × 10¹ + 4 × 10⁰
= 200   + 50     + 4
= 254

2진법에서 11111110은:

text
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으로 변환

python
# 10진법 → 2진법
print(bin(254)) # '0b11111110'
print(bin(42)) # '0b101010'
# 2진법 → 10진법
print(int('11111110', 2)) # 254
print(int('101010', 2)) # 42
# 16진법 (2진법의 축약)
print(hex(254)) # '0xfe'
print(int('fe', 16)) # 254

0b는 2진법, 0x는 16진법을 나타내는 접두사입니다.


비트와 바이트

  • 비트(bit): 0 또는 1, 정보의 최소 단위
  • 바이트(byte): 8비트 = 1바이트
text
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 byte8 bits영문자 1개
1 KB1,024 bytes짧은 텍스트 파일
1 MB1,024 KB고해상도 사진 1장
1 GB1,024 MB영화 1편 (SD)
1 TB1,024 GB대용량 하드디스크

텍스트의 이진 표현 — ASCII와 Unicode

컴퓨터에 "문자"라는 개념은 없습니다. 모든 문자는 숫자에 대응됩니다.

ASCII — 영문자 128개

python
# 문자 → ASCII 코드
print(ord('A')) # 65
print(ord('a')) # 97
print(ord('0')) # 48
print(ord(' ')) # 32
# ASCII 코드 → 문자
print(chr(65)) # 'A'
print(chr(97)) # 'a'
print(chr(48)) # '0'
text
'A' = 65 = 01000001 (2진법)
'B' = 66 = 01000010
'a' = 97 = 01100001
'0' = 48 = 00110000

ASCII는 7비트로 128개 문자를 표현합니다 — 영문 대소문자, 숫자, 특수문자. 하지만 한국어, 일본어, 중국어는 표현할 수 없습니다.

Unicode — 전 세계 문자

python
print(ord('가')) # 44032
print(ord('한')) # 54620
print(hex(ord('가'))) # '0xac00'
print(chr(44032)) # '가'
print(chr(127829)) # '🍕' (피자 이모지)
# UTF-8 인코딩 — 바이트 수 확인
print('A'.encode('utf-8')) # b'A' — 1 byte
print('가'.encode('utf-8')) # b'\xea\xb0\x80' — 3 bytes
print('🍕'.encode('utf-8')) # b'\xf0\x9f\x8d\x95' — 4 bytes

Unicode는 14만+ 문자를 포함합니다. UTF-8은 Unicode를 저장하는 방식으로, 영어는 1바이트, 한국어는 3바이트, 이모지는 4바이트를 사용합니다.


색상의 이진 표현 — RGB

화면의 모든 색상은 빨강(R), 초록(G), 파랑(B) 세 값의 조합입니다. 각 값은 0~255(1바이트).

python
# RGB 값 → 16진법 색상 코드
r, g, b = 255, 128, 0
hex_color = f"#{r:02x}{g:02x}{b:02x}"
print(hex_color) # #ff8000 (orange)
# 16진법 → RGB
hex_str = "ff8000"
r = int(hex_str[0:2], 16) # 255
g = int(hex_str[2:4], 16) # 128
b = int(hex_str[4:6], 16) # 0
색상RGB16진법
빨강25500#ff0000
초록02550#00ff00
파랑00255#0000ff
흰색255255255#ffffff
검정000#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를 보면:

text
5 = 00000101
-5 = 11111011

2의 보수를 만드는 방법: 모든 비트를 반전(0→1, 1→0)한 뒤 1을 더합니다.

text
5    = 00000101
반전   = 11111010
+1    = 11111011  →  이것이 -5
python
# Python에서 확인
print(bin(5)) # 0b101
print(bin(-5 & 0xff)) # 0b11111011 (8비트 기준)
# 2의 보수의 장점: 덧셈 회로 하나로 뺄셈도 가능
# 5 + (-5) = 00000101 + 11111011 = 100000000
# 9비트째는 버림 → 00000000 = 0 (정확!)

이 방식 덕분에 CPU는 별도의 뺄셈 회로 없이, 덧셈 회로만으로 뺄셈을 처리합니다.

8비트 2의 보수로 표현 가능한 범위: -128 ~ +127 (총 256개).


비트 연산 — 0과 1의 직접 조작

프로그래밍에서 비트를 직접 다루는 연산이 있습니다.

python
a = 0b1100 # 12
b = 0b1010 # 10
# AND — 둘 다 1이면 1
print(bin(a & b)) # 0b1000 (8)
# OR — 하나라도 1이면 1
print(bin(a | b)) # 0b1110 (14)
# XOR — 다르면 1
print(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)이 비트 연산으로 작동합니다.

python
READ = 0b100 # 4
WRITE = 0b010 # 2
EXECUTE = 0b001 # 1
# 권한 설정 (OR로 합침)
user_perm = READ | WRITE | EXECUTE # 0b111 = 7
group_perm = READ | EXECUTE # 0b101 = 5
other_perm = READ | EXECUTE # 0b101 = 5
print(f"chmod {user_perm}{group_perm}{other_perm}") # chmod 755
# 권한 확인 (AND로 검사)
has_write = bool(user_perm & WRITE) # True
has_write_g = bool(group_perm & WRITE) # False

chmod 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인지 설명할 수 있습니다.