본문 바로가기

논리회로설계 02 - Number Systems

@밀양박씨!2026. 5. 10. 05:56

 

개요

 

디지털 시스템은 모든 데이터를 0과 1로 표현합니다. 그렇다면 우리가 평소 쓰는 숫자를 어떻게 0과 1로 바꾸고, 그것들을 회로에서 어떻게 더하고 뺄까요? 이 글은 그 질문에 답합니다.

크게 두 가지 주제를 다룹니다. 첫 번째는 수 체계(Number Systems)로, 2진수·16진수의 개념과 변환, 부호 있는 수의 표현 방식을 설명합니다. 두 번째는 기본 논리 함수(Basic Logic Functions)로, AND·OR·NOT 게이트가 스위치 회로에서 어떻게 출발했는지, 진리표와 논리 회로는 어떻게 이어지는지를 다룹니다.


1. 수 체계 (Number Systems)

10진수와 2진수의 구조

10진수는 각 자리가 10의 거듭제곱을 나타냅니다. 예를 들어 5374는 아래와 같이 분해됩니다.

5374₁₀ = 5 × 10³ + 3 × 10² + 7 × 10¹ + 4 × 10⁰

2진수도 같은 원리입니다. 각 자리가 2의 거듭제곱을 나타내며, 값은 0 또는 1만 가질 수 있습니다.

1101₂ = 1 × 2³ + 1 × 2² + 0 × 2¹ + 1 × 2⁰
       = 8 + 4 + 0 + 1
       = 13₁₀

2의 거듭제곱 — 암기 목록

2진수를 빠르게 다루려면 2의 거듭제곱값을 익혀두는 것이 좋습니다. 최소 2⁹까지는 외워두면 계산이 훨씬 편합니다.

거듭제곱 거듭제곱
2⁰ 1 2⁵ 32
2 2⁶ 64
4 2⁷ 128
8 2⁸ 256
2⁴ 16 2⁹ 512

큰 단위도 기억해 두면 유용합니다. 2¹⁰ = 1,024로 약 1킬로(kilo), 2²⁰은 약 1메가(mega), 2³⁰은 약 1기가(giga)에 해당합니다. 예를 들어 2²⁴의 값을 추정할 때는 2⁴ × 2²⁰ = 16 × 1M = 약 1600만으로 계산할 수 있습니다.

2진수 변환 방법

2진수 → 10진수: 각 자리의 값(2의 거듭제곱)에 해당 비트를 곱해 모두 더합니다.

10011₂ → 16×1 + 8×0 + 4×0 + 2×1 + 1×1 = 19₁₀

10진수 → 2진수: 숫자보다 작거나 같은 2의 거듭제곱 중 가장 큰 것부터 차례로 빼나가며 비트를 결정합니다.

47₁₀ → 32×1 + 16×0 + 8×1 + 4×1 + 2×1 + 1×1 = 101111₂

 

 


2. 16진수 (Hexadecimal)

16진수는 0~9와 A~F를 사용하며, 한 자리가 4개의 2진수 비트에 정확히 대응합니다. 그래서 긴 2진수를 짧고 읽기 쉽게 표현할 때 자주 씁니다. 코드에서는 주로 0x 접두어로 표기합니다.

16진수 10진수 2진수 16진수 10진수 2진수
0 0 0000 8 8 1000
1 1 0001 9 9 1001
2 2 0010 A 10 1010
3 3 0011 B 11 1011
4 4 0100 C 12 1100
5 5 0101 D 13 1101
6 6 0110 E 14 1110
7 7 0111 F 15 1111

16진수 → 2진수 변환은 각 자리를 4비트로 바꾸면 됩니다. 예를 들어 0x4AF는 다음과 같습니다.

4    →  0100
A(10) → 1010
F(15) → 1111

0x4AF = 0100 1010 1111₂

16진수 → 10진수는 각 자리에 16의 거듭제곱을 곱해 더합니다.

0x4AF = 4 × 16² + 10 × 16¹ + 15 × 16⁰
       = 1024 + 160 + 15
       = 1199₁₀

3. 2진수 덧셈과 오버플로

2진수 덧셈

2진수 덧셈은 10진수 덧셈과 원리가 같습니다. 한 자리의 합이 1을 넘으면 올림(carry)이 발생합니다.

 

오버플로 (Overflow)

디지털 시스템은 정해진 비트 수(고정 폭)만 사용합니다. 연산 결과가 그 폭을 초과하면 오버플로(Overflow)가 발생합니다. 위 예에서 4비트 시스템에서 11 + 6 = 17을 계산하면 결과가 5비트가 필요해 4비트 안에 담을 수 없습니다. 실제 프로그램에서 정수 오버플로 버그가 생기는 이유가 바로 이것입니다.

 

 


4. 부호 있는 수의 표현

10진수에서 음수는 그냥 앞에 '-'를 붙이면 됩니다. 2진수에서는 어떻게 할까요? 세 가지 방식이 있습니다.

부호-크기 표현 (Sign and Magnitude)

가장 왼쪽 비트(MSB)를 부호 비트로 사용합니다. 0이면 양수, 1이면 음수이고 나머지 비트가 크기(magnitude)를 나타냅니다.

0101₂ = +5₁₀
1101₂ = -5₁₀

사람이 이해하기에는 직관적이지만, 컴퓨터 회로 구현에는 적합하지 않습니다. 부호가 다른 두 수를 더하려면 크기를 비교하고 빼는 별도의 회로(Subtractor, Comparator)가 필요하기 때문입니다.

 

 

1의 보수 (1's Complement)

양수 P에 해당하는 음수 K는 K = (2ⁿ - 1) - P로 구합니다. 실질적으로는 모든 비트를 반전(0→1, 1→0)하는 것과 같습니다.

+5 = 0101₂
-5 = 1010₂  (모든 비트 반전)

+3 = 0011₂
-3 = 1100₂  (모든 비트 반전)

덧셈 시 부호 비트에서 올림(carry)이 발생하면 결과의 LSB에 1을 더해야 하는 번거로움이 있습니다. 그래서 실제로는 거의 사용하지 않습니다.

 

2의 보수 (2's Complement) — 실제 컴퓨터가 사용하는 방식

 

양수 P에 해당하는 음수 K는 K = 2ⁿ - P로 구합니다. 핵심 특성은 어떤 수와 그 2의 보수를 더하면 올림을 무시할 때 0이 된다는 점입니다.

+5 = 0101₂
-5 = 1011₂  (2의 보수)
     → 0101 + 1011 = 10000, 올림 무시 → 0000 (0)

변환 단축법: 오른쪽(LSB)부터 읽어 처음 나오는 1까지는 그대로 복사하고, 그 이후 비트는 모두 반전합니다.

+6  = 0110₂
      오른쪽부터: 0 복사 → 처음 1 복사 → 나머지 반전
-6  = 1010₂

2의 보수 방식의 최대 장점은 덧셈 회로만으로 뺄셈을 처리할 수 있다는 것입니다. A - B = A + (-B)이고, -B는 B의 2의 보수이므로, 뺄셈을 그냥 덧셈으로 바꿔 계산합니다. 부호 비트에서 올림이 나오면 그냥 버립니다.

 

 

세 방식 비교 (4비트 기준)

비트 패턴 부호-크기 1의 보수 2의 보수
0111 +7 +7 +7
0000 +0 +0 0
1000 -0 -7 -8
1111 -7 -0 -1

부호-크기와 1의 보수는 0이 두 개(+0, -0) 존재하는 문제가 있습니다. 2의 보수는 0이 하나뿐이고, n비트로 -2^(n-1) ~ +2^(n-1)-1 범위를 빠짐없이 표현합니다. 현대 컴퓨터가 2의 보수를 채택한 이유입니다.

핵심 정리: 2의 보수는 덧셈 회로 하나만으로 뺄셈까지 처리할 수 있어 회로 구현이 가장 단순합니다. 실제 CPU가 정수를 저장하는 방식입니다.

 

 

5. 기본 논리 함수 (Basic Logic Functions)

스위치에서 게이트로

논리 함수는 스위치 회로에서 출발합니다. 스위치가 열리면 0, 닫히면 1입니다. 전구가 켜지는 조건을 수식으로 쓴 것이 논리 함수입니다.

  • 직렬 연결 (AND): 두 스위치가 모두 닫혀야 전구가 켜집니다. → L(x1, x2) = x1 · x2
  • 병렬 연결 (OR): 둘 중 하나라도 닫히면 전구가 켜집니다. → L(x1, x2) = x1 + x2
  • 반전 (NOT): 스위치가 열릴 때 전구가 켜집니다. → L(x) = x'

AND·OR·NOT 세 가지를 조합하면 어떤 복잡한 논리 함수도 만들 수 있습니다. 예를 들어 세 스위치 회로에서 x1, x2가 병렬이고 그 결과가 x3과 직렬이면 아래와 같습니다.

L(x1, x2, x3) = (x1 + x2) · x3

진리표 (Truth Table)

진리표는 모든 입력 조합에 대해 출력값을 나열한 표입니다. n개의 입력이 있으면 행이 2ⁿ개 필요합니다. 아래는 AND와 OR의 진리표입니다.

x1 x2 x1 · x2 (AND) x1 + x2 (OR)
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1

진리표는 유일하고 직관적이지만, 입력이 늘어날수록 행이 기하급수적으로 늘어납니다(5입력이면 32행). 그래서 논리식이나 회로 도면과 함께 사용합니다.

 

 

단항연산자(Inversion)

 

위  논리회로를 설명하기 위한 논리식 -

L(x) = ~x - 함수는 다음과 같습니다
• L = 1, if x = 0
• L = 0, if x = 1


 

6. 논리 게이트와 회로 분석 및 합성

논리 게이트

 

AND·OR·NOT 연산은 트랜지스터로 구현한 논리 게이트(logic gate)로 실체화됩니다. 각 게이트는 하나 이상의 입력을 받아 하나의 출력을 냅니다. 게이트를 여러 개 연결하면 복잡한 논리 회로를 만들 수 있습니다.

 

 

분석 (Analysis) — 회로 → 논리식

주어진 논리 회로에서 출력 함수를 도출하는 과정입니다. 출력에서 입력 방향으로 거슬러 올라가며 각 게이트의 출력을 차례로 수식으로 바꿉니다.

같은 진리표를 갖는 서로 다른 회로를 기능적으로 동등(functionally equivalent)하다고 합니다. 설계자는 동등한 회로 중 가장 단순한 것을 선택해 비용을 낮춥니다.

 

 

합성 (Synthesis) — 논리식 → 회로

주어진 논리식을 게이트 회로로 구현하는 과정입니다. 연산 우선순위(괄호 → NOT → AND → OR)에 따라 단계적으로 게이트를 배치합니다.

f = x1' + (x1 · x2)
  1단계: x1에 NOT 게이트 → x1'
  2단계: x1, x2에 AND 게이트 → x1 · x2
  3단계: x1', (x1 · x2)에 OR 게이트 → f

 

타이밍 다이어그램 (Timing Diagram)

논리 회로의 동작을 시간 축 위에 파형으로 나타낸 것입니다. 왼쪽에서 오른쪽으로 시간이 흐르고, 각 신호의 0/1 상태 변화가 표시됩니다. 시뮬레이션 도구에서 회로 검증에 널리 사용됩니다.

 

 


핵심 요약

주제 핵심 내용
2진수 변환 각 자리 = 2의 거듭제곱. 10진수 ↔ 2진수, 16진수 ↔ 2진수 변환 가능
오버플로 결과가 고정 비트 수를 초과할 때 발생
부호 표현 3종 부호-크기(직관적), 1의 보수(비트 반전), 2의 보수(실제 CPU 사용)
2의 보수 장점 덧셈 회로만으로 뺄셈 처리. A - B = A + (-B)
논리 게이트 AND(·), OR(+), NOT(') — 스위치 회로에서 출발, 트랜지스터로 구현
분석 vs 합성 분석: 회로 → 논리식 / 합성: 논리식 → 회로

Digital Logic Design — Yongsoo Joo (Kookmin Univ. KESL) | Lecture 3 정리

밀양박씨!
@밀양박씨! :: 박씨의 개발블로그

lovebotw049 님의 블로그 입니다.

목차