4장 이진수, 불 논리, 게이트와 회로
이번 강의에서 배울 것
- 10진수·2진수·8진수·16진수를 서로 변환하고, 고정 길이에서 overflow를 판정할 수 있다.
- 부호-크기와 2의 보수로 음수를 표현하고 차이를 설명할 수 있다.
- 진리표에서 sum-of-products 식과 AND·OR·NOT 회로를 만들 수 있다.
4장 이진수, 불 논리, 게이트와 회로
학습 흐름
외부 표현(10진수, 키보드 문자) ↔ 내부 표현(2진수, 2진 코드)
↓
부호 없는 정수 → 부호-크기 → 2의 보수 → 부동소수점 → 문자(ASCII/Unicode) → 소리·이미지
↓
왜 2진수인가: bistable(켜짐/꺼짐)이 가장 신뢰성 높음 → transistor
↓
불 논리(AND·OR·NOT) → 진리표 → 게이트 → 회로(sum-of-products) → 1-ADD, multiplexor, decoder1. 외부 표현과 내부 표현
키보드로 A를 누르면 메모리에는 01000001이 저장되고, 화면에 다시 A로 보입니다(Figure 4.1). 사람이 보는 것은 external representation(10진수, 문자), 컴퓨터가 저장하는 것은 internal representation(2진수)입니다. 표현의 요구조건은 clear, unambiguous, reliable입니다.
2. 진법(positional numbering system)
| 2의 거듭제곱 | 2⁰ | 2¹ | 2² | 2³ | 2⁴ | 2⁵ | 2⁶ | 2⁷ | 2⁸ | 2⁹ | 2¹⁰ |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 값 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 |
2진수 → 10진수: 1이 있는 자리의 2ᵏ를 더한다
| 2진수 | 계산 | 10진수 |
|---|---|---|
| 11000 | 16 + 8 | 24 |
| 110001 | 32 + 16 + 1 | 49 |
| 1111111 | 2⁷ − 1 | 127 |
| 1000000000 | 2⁹ | 512 |
10진수 → 2진수: 2로 계속 나누고 나머지를 아래에서 위로 읽는다
9 ÷ 2 = 4 … 1 ↑
4 ÷ 2 = 2 … 0 │ 아래에서 위로 읽기
2 ÷ 2 = 1 … 0 │
1 ÷ 2 = 0 … 1 │ → 9 = 1001₂다른 밑
| 수 | 계산 | 10진수 |
|---|---|---|
| 133₄ | 1·16 + 3·4 + 3 | 31 |
| 367₈ (octal) | 3·64 + 6·8 + 7 | 247 |
| 1BA₁₆ (hex) | 1·256 + 11·16 + 10 | 442 |
3. 고정 길이 정수와 overflow
컴퓨터는 정수를 고정 길이로 저장합니다. 4비트면 015, 8비트면 0255, k비트면 0 ~ 2ᵏ − 1.
2진 덧셈 규칙: 0+0=0, 0+1=1, 1+0=1, 1+1=0 carry 1, 1+1+1 = 1 carry 1
carry 1 1 1
0 1 0 1 (5)
+ 0 0 1 1 (3)
---------
1 0 0 0 (8)(1) 23, 55, 275를 8비트 부호 없는 2진수로 쓰시오. 275에서 무엇이 이상한가?
(2) 10비트 덧셈 0011100011 + 0001101110 을 하시오.
정답 확인
(1) 23 = 00010111, 55 = 00110111, 275 = 100010011₂는 9비트가 필요하다. 8비트에 넣으면 맨 앞 1이 잘려 00010011 = 19가 된다 → overflow.
(2) 227 + 110 = 337 → 0101010001
carry 0 1 1 1 0 1 1 1 0 0 ← 각 열로 들어오는 carry
0 0 1 1 1 0 0 0 1 1 (227)
+ 0 0 0 1 1 0 1 1 1 0 (110)
---------------------
0 1 0 1 0 1 0 0 0 1 (337)오른쪽부터: 1+0=1 / 1+1=0 c1 / 0+1+1=0 c1 / 0+1+1=0 c1 / 0+0+1=1 / 1+1=0 c1 / 1+1+1=1 c1 / 1+0+1=0 c1 / 0+0+1=1 / 0+0=0
4. 음수 표현
4-1. 부호-크기 (sign/magnitude)
맨 왼쪽 1비트가 부호(0 = +, 1 = −), 나머지가 크기.
- +5 = 0101, −5 = 1101
- 문제점: 0이 두 개 — 0000(+0)과 1000(−0). 덧셈 회로도 부호를 따로 처리해야 함.
| 10비트 부호-크기 | 부호 | 크기 | 값 |
|---|---|---|---|
| 1000110001 | − | 000110001 = 49 | −49 |
| 0110011000 | + | 110011000 = 408 | +408 |
| 1000000001 | − | 1 | −1 |
| 1000000000 | − | 0 | −0 (= 0) |
10비트 부호-크기의 범위: −511 ~ +511 (크기 9비트 → 2⁹ − 1).
4-2. 2의 보수 (two's complement)
| 16비트 2의 보수 | 2진수 |
|---|---|
| +45 | 0000 0000 0010 1101 |
| −68 | 1111 1111 1011 1100 |
| −1 | 1111 1111 1111 1111 |
| 0 | 0000 0000 0000 0000 |
| 45 + (−68) = −23 | 1111 1111 1110 1001 |
5. 부동소수점 (floating point)
10진 과학 표기 1.35 × 10⁻⁵ 처럼, 2진수도 가수(mantissa) × 2^지수(exponent) 로 씁니다.
3.25₁₀ = 11.01₂ = 1.101 × 2¹
6. 문자, 소리, 이미지
문자
| 코드 | 문자당 비트 | 특징 |
|---|---|---|
| ASCII | 8비트 | 영어 중심. A = 65 = 01000001, a = 97, 0 = 48, 공백 = 32 |
| Unicode | 16비트 | 세계 문자(한글 포함) |
Mike → 01001101 01101001 01101011 01100101
"Invitation to Computer Science"(따옴표 제외)를 ASCII와 Unicode로 저장하면 각각 몇 비트인가?
정답 확인
공백 3개 포함 30문자 → ASCII 30 × 8 = 240비트, Unicode 30 × 16 = 480비트. 공백도 문자라는 점을 잊지 말 것.
소리: analog → digital
| 용어 | 뜻 |
|---|---|
| amplitude | 한 순간 파형의 높이 (소리 크기) |
| period | 파형이 반복되기까지의 시간 |
| frequency | 단위 시간당 period 수 (음 높이) |
| Digitize | 디지털 형태로 바꾸는 것 |
| Sampling | 일정한 간격으로 파형 값을 기록 |
| Sampling rate | 초당 샘플 수 — 클수록 파형이 정확 |
| Bit depth | 샘플당 비트 수 — 클수록 진폭이 정확 |
이미지
- Pixel: 2차원 격자에서 기록한 개별 샘플
- RGB: 빨강·초록·파랑 각 1바이트(8비트) → 픽셀당 24비트, 1,677만 색
- Raster graphics: 그림을 픽셀 값의 2차원 격자로 저장
- 8단계 회색조(gray scale)면 픽셀당 3비트
(1) 초당 40,000 샘플, bit depth 16으로 3분짜리 노래를 압축 없이 저장하면 몇 비트인가? 압축비 5:1이면?
(2) 1,200 × 800 RGB 이미지를 압축 없이 저장하면 몇 비트인가? 실제로 2.4 Mbit라면 압축비는?
정답 확인
(1) 180초 × 40,000 × 16 = 115,200,000 비트(약 14.4 MB), 5:1이면 23,040,000 비트
(2) 1,200 × 800 × 24 = 23,040,000 비트, 23,040,000 / 2,400,000 = 9.6 : 1
데이터 압축
| 종류 | 뜻 | 예 |
|---|---|---|
| Lossless | 완벽히 복원 가능 | run-length encoding, variable-length code (Huffman), ZIP |
| Lossy | 완벽히 복원 불가, 대신 압축률 높음 | JPEG, MP3 |
xxxyyyyyyzzzzAAxxxx를 run-length encoding으로 압축하고 압축비를 구하시오(문자·숫자 각 8비트).
정답 확인
3x6y4z2A4x — 원본 19문자 → 10문자, 압축비 19/10 = 1.9 : 1
7. 왜 2진수인가 — bistable과 transistor
2진수의 단점(교재 연습 14): 같은 값을 쓰는 데 자릿수가 훨씬 많고(약 3.3배), 사람이 읽기 어려워 변환이 필요하다.
8. 불 논리 (Boolean logic)
| 연산 | 표기 | 참이 되는 경우 |
|---|---|---|
| AND | a · b | 둘 다 참 |
| OR | a + b | 하나 이상 참 |
| NOT | ā, ~a | 반대 |
교재 예: (0 ≤ x) AND (x ≤ 35), (a = 12) OR (a = 13), NOT (a = 12)
a = 1, b = 2, c = 2 일 때 값을 구하시오.
(1) (a > 1) OR (b = c) (2) [(a + b) > c] AND (b ≤ c) (3) NOT (a = 1) (4) NOT [(a = b) OR (b = c)]
정답 확인
(1) F OR T = T (2) (3 > 2) AND (2 ≤ 2) = T (3) F (4) NOT (F OR T) = F
9. 게이트
10. 회로 만들기: sum-of-products
Circuit — 입력선, 선으로 연결된 게이트, 출력선으로 이루어짐. 이 장의 회로는 출력이 현재 입력에만 의존한다(상태 없음, no state).
- 회로 → 불 식: 출력에서 거꾸로 게이트를 따라가며 연산자로 바꾼다.
- 원하는 동작 → 회로: sum-of-products 알고리즘(Figure 4.21)
1 원하는 회로의 진리표를 만든다
2 출력 열이 남아 있는 동안 3~6을 반복
3 출력 열 하나를 고른다
4 출력이 1인 행마다 AND·NOT으로 부분식(product)을 만든다
- 그 행에서 1인 입력은 그대로, 0인 입력은 NOT
5 부분식들을 OR로 합친다 (sum)
6 회로도를 그린다
7 Done족보 유형 1: 2입력 (Sample Q2 = logical implication)
| a | b | output |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
위 진리표를 AND, OR, NOT만으로 구현하는 sum-of-products 식을 쓰고 회로를 그리시오.
정답 확인
1인 행: 00, 01, 11
output = (ā · b̄) + (ā · b) + (a · b)
회로도는 세 층으로 그린다.
① NOT 층 ② AND 층 (행마다 하나) ③ OR 층
a ─[NOT]─ ā ─┐
b ─[NOT]─ b̄ ─┴─[AND]─ ā·b̄ ─┐
│
ā ─────────────┐ ├─[OR]─ output
b ─────────────┴─[AND]─ ā·b ──┤
│
a ─────────────┐ │
b ─────────────┴─[AND]─ a·b ──┘NOT 2개, AND 3개, 3입력 OR 1개(또는 2입력 OR 2개). 시험지에는 입력선 a, b를 세로로 길게 긋고 필요한 게이트로 가지를 치면 깔끔하다(교재 Figure 4.20 방식).
이 연산을 logical implication(a → b)이라 하며, 단순화하면 ā + b와 같다(a가 참일 때 b도 참이어야만 참).
족보 유형 2: 3입력 (중간 족보 문제 9 = even parity)
입력 중 1의 개수가 0개 또는 2개일 때만 1.
| a | b | c | 1의 개수 | output |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 2 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 2 | 1 |
| 1 | 1 | 0 | 2 | 1 |
| 1 | 1 | 1 | 3 | 0 |
output = (ā · b̄ · c̄) + (ā · b · c) + (a · b̄ · c) + (a · b · c̄)
(1) NAND (a · b의 NOT)를 AND, OR, NOT만으로 sum-of-products로 만드시오.
(2) 3입력 majority-rules 회로(1이 2개 이상이면 1)의 식을 쓰시오. 어디에 쓰이는가?
정답 확인
(1) 1인 행 00, 01, 10 → (ā · b̄) + (ā · b) + (a · b̄)
(2) 1인 행 011, 101, 110, 111 → (ā · b · c) + (a · b̄ · c) + (a · b · c̄) + (a · b · c)
우주선처럼 수리할 수 없는 환경에서 컴퓨터 3대가 같은 계산을 하고 2대 이상 같은 답을 채택하는 fault-tolerant computing에 쓰인다.
11. 1-ADD (full adder)와 덧셈 회로
1장 덧셈 알고리즘의 한 자리를 그대로 회로로 만든 것입니다.
| aᵢ | bᵢ | cᵢ | sᵢ (합) | cᵢ₊₁ (새 carry) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
- sᵢ = 1의 개수가 홀수일 때 1
- cᵢ₊₁ = 1의 개수가 2개 이상일 때 1 (= majority 회로)
1-ADD를 N개 이어 붙이면(앞 자리의 carry를 다음 자리 입력으로) N비트 덧셈기가 됩니다.
12. 제어 회로: multiplexor와 decoder
| 회로 | 입력 | 출력 | 하는 일 | 쓰임 |
|---|---|---|---|---|
| Multiplexor | 2ᴺ 입력선 + N 선택선 | 1 | 선택선 패턴에 해당하는 입력 하나를 골라 출력으로 보냄 | 레지스터 R0~R3 중 하나를 골라 test-if-zero 회로로 |
| Decoder | N 입력선 | 2ᴺ 출력선 | 입력 패턴에 해당하는 출력선 하나만 1, 나머지 0 | op code 00/01/10/11 → add/subtract/multiply/divide 회로 중 하나를 켬 |
2입력 multiplexor: output = (a · S̄) + (b · S) — 선택선 S가 0이면 a, 1이면 b.
(1) 4입력, 8입력 multiplexor에 필요한 선택선 수는? (2) ALU가 20가지 연산 중 하나를 고르려면 multiplexor에 선택선이 몇 개 필요한가?
정답 확인
(1) 4 = 2² → 2개, 8 = 2³ → 3개
(2) 2⁴ = 16 < 20 ≤ 32 = 2⁵ → 5개 (32입력 multiplexor를 쓰고 12개 입력은 사용 안 함)
13. 슬라이드 코딩 테스트: Netflix와 Wavve
N명에게 "Netflix를 구독하나요?(A명 yes)", "Wavve를 구독하나요?(B명 yes)"라고 물었다. 둘 다 구독하는 사람 수의 최대와 최소를 구하는 식을 쓰고, 테스트 케이스마다 #번호 최대 최소를 출력하는 코드를 쓰시오. (1 ≤ N ≤ 100, 0 ≤ A, B ≤ N)
정답 확인
- 최대 = min(A, B) — 적은 쪽이 모두 다른 쪽에 포함될 때
- 최소 = max(0, A + B − N) — 최대한 겹치지 않게 나누고 남는 인원만 겹침
| N, A, B | 최대 | 최소 |
|---|---|---|
| 10, 3, 5 | 3 | 0 |
| 10, 7, 5 | 5 | 2 |
| 100, 100, 100 | 100 | 100 |
집합으로 보면 |A ∩ B| = |A| + |B| − |A ∪ B|이고 |A ∪ B| ≤ N 이므로 최소가 A + B − N이다. 불 논리의 AND가 집합의 교집합이다.
T = int(input())
for t in range(1, T + 1):
N, A, B = map(int, input().split())
print(f"#{t} {min(A, B)} {max(0, A + B - N)}")정리 카드
2의 보수로 음수를 만드는 법과 장점은?
모든 비트를 뒤집고 1을 더한다. 0이 하나뿐이고 뺄셈을 덧셈 회로로 처리할 수 있다.
k비트 부호-크기와 2의 보수의 범위는?
부호-크기 −(2ᵏ⁻¹ − 1) ~ +(2ᵏ⁻¹ − 1), 2의 보수 −2ᵏ⁻¹ ~ 2ᵏ⁻¹ − 1.
소리 품질을 결정하는 두 요소는?
sampling rate(초당 샘플 수)와 bit depth(샘플당 비트 수).
컴퓨터가 2진수를 쓰는 이유는?
bistable 장치(on/off)가 두 상태만 구별하면 되어 가장 신뢰성이 높기 때문.
sum-of-products 알고리즘의 핵심 단계는?
진리표에서 출력이 1인 행마다 입력(0이면 NOT)을 AND로 묶고, 그 부분식들을 OR로 합친다.
multiplexor와 decoder의 입출력은?
multiplexor는 2ᴺ 입력 + N 선택선 → 1 출력, decoder는 N 입력 → 2ᴺ 출력 중 하나만 1.
NOT, AND, OR, NAND/NOR의 transistor 수는?
1, 3, 3, 2.
내용을 이해했다면 학습 완료를 체크해 주세요.