Skip to Content
독학사독학사 2단계논리회로07. 코드 체계 I: BCD·그레이·여분3 코드

이번 문서의 목표: 이 문서를 다 읽으면 BCD·그레이·여분3 코드가 각각 어떤 문제를 해결하기 위해 만들어졌는지 설명하고, 10진 숫자나 2진수가 주어졌을 때 이 세 코드로 직접 변환하며, 각 코드의 대표적인 특징(자기보수성, 인접성 등)을 근거를 들어 판별할 수 있다.

왜 순수한 2진수만으로는 부족한가

06편에서 배운 순수 2진수(pure binary)는 정수 값을 가장 효율적으로 표현하는 방법이지만, 모든 상황에 적합한 것은 아니다. 두 가지 대표적인 상황을 생각해 보자.

첫째, 디지털 시계·계산기·엘리베이터 층수 표시장치처럼 사람이 읽는 10진 숫자를 그대로 다뤄야 하는 장치에서는, 10진 자리 하나하나를 별도로 부호화해 두는 편이 회로 설계와 표시에 더 편리하다. 이런 필요에서 나온 것이 BCD 코드다.

둘째, 회전하는 축의 각도나 아날로그 신호를 일정 간격으로 측정해 디지털 값으로 바꾸는 장치(예: 각도 센서)에서는, 측정값이 한 단계 바뀔 때 여러 비트가 한꺼번에 바뀌면 순간적인 오작동이 생길 위험이 있다. 이 문제를 해결하기 위해 나온 것이 그레이 코드다.

이 두 코드에 더해, 코드 자체에 재미있는 대칭성을 부여해 뺄셈 회로를 간단하게 만드는 여분3 코드까지 이번 문서에서 함께 다룬다. 세 코드 모두 “왜 순수 2진수만으로는 부족했는가”라는 질문에서 출발했다는 공통점을 기억하면, 각각의 규칙을 외우기보다 이해하며 받아들일 수 있다.

쉽게 말하면: 순수 2진수는 계산에는 효율적이지만, “사람이 읽기 편하게” 또는 “값이 바뀔 때 안전하게” 같은 목적에는 다른 코드가 더 유리하다.

BCD 코드 — 10진 숫자를 4비트씩 그대로 저장하기

BCD(Binary Coded Decimal, 2진화 10진 코드)는 10진수의 각 자리 숫자(0~9)를 따로따로 4비트 2진수로 바꿔서 이어 붙이는 코드다. 4비트는 24=162^4=16가지 조합을 만들 수 있지만, BCD는 그중 0000(0)부터 1001(9)까지 10가지만 사용하고 나머지 1010(10)부터 1111(15)까지 6가지는 사용하지 않는다. 이렇게 정해진 코드 없이 남겨 둔 조합을 잉여 코드(또는 무효 코드, invalid code)라고 부른다.

10진 숫자BCD (4비트)
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001

예제: 10진수 producing BCD 변환

10진수 483을 BCD로 바꿔 보자. 각 자리(4, 8, 3)를 따로따로 4비트로 바꾸면 4 = 0100, 8 = 1000, 3 = 0011이므로, 이어 붙인 BCD 코드는 0100 1000 0011이다.

여기서 반드시 짚어야 할 함정이 있다. BCD 0100 1000 0011을 06편에서 배운 순수 2진수로 곧바로 읽어 10진 변환하면 안 된다. 순수 2진수라면 이 12비트를 211,210,2^{11}, 2^{10}, \dots 순서로 계산해야 하지만, BCD는 애초에 “4비트씩 잘라서 각각 하나의 10진 자리로 읽는” 규칙이기 때문에, 이 값을 순수 2진수의 자리값 공식에 대입하면 완전히 다른(그리고 틀린) 숫자가 나온다.

쉽게 말하면: BCD는 “10진수 483을 2진수 하나로 통째로 바꾼 것”이 아니라, “4는 4대로, 8은 8대로, 3은 3대로 각각 4비트짜리 상자에 담아 나열한 것”이다.

BCD 덧셈에서 보정이 필요한 이유

BCD로 표현된 두 수를 순수 2진 덧셈 규칙으로 그냥 더하면, 결과가 유효한 BCD 자리(0~9)를 벗어나거나 자리올림이 잘못될 수 있다. 그래서 BCD 덧셈에는 보정 규칙이 필요하다. 자리 하나를 더한 결과가 9(1001)를 초과하거나, 2진 덧셈 과정에서 자리올림(carry)이 발생하면, 그 자리에 6(0110)을 추가로 더해 올바른 BCD 자리로 보정한다.

예제: BCD 5 + BCD 8의 보정 계산

1단계: 두 BCD 값을 그대로 더한다

5(0101) + 8(1000) = 1101(2진수로는 13)

2단계: 결과가 9를 초과하는지 확인한다

1101은 10진수로 13이며, 이는 BCD 한 자리의 최댓값인 9를 초과한다.

3단계: 6(0110)을 더해 보정한다

1101(13) + 0110(6) = 10011(19)

4단계: 결과를 BCD 자릿수로 해석한다

10011은 상위 4비트를 넘는 자리올림 1과 하위 4비트 0011(3)로 나뉜다. 즉 자리올림 1(다음 10진 자리로 넘어감), 현재 자리 3이 되어 최종 결과는 13이라는 뜻이 된다.

실제로 5+8=13이 맞으므로, 보정 후 “자리올림 1, 현재 자리 3”이라는 결과는 13을 BCD 두 자리(0001 0011)로 정확히 표현한 것과 같다. 이 보정 규칙(순수 2진 덧셈 결과가 9를 초과하거나 자리올림이 나오면 6을 더한다)은 시험에서 BCD 가산기의 동작 원리를 묻는 문제로 자주 출제된다.

그레이 코드 — 인접한 값 사이에 1비트만 바뀌게 하기

그레이 코드(Gray code)는 프랭크 그레이(Frank Gray)의 이름을 딴 코드로, 가장 큰 특징은 연속된 두 값 사이에서 오직 한 비트만 바뀐다는 점이다(이 성질을 인접 코드, adjacent code라고도 부른다). 순수 2진수는 이 성질을 만족하지 않는다. 예를 들어 순수 2진수 3(011)에서 4(100)로 넘어갈 때 세 비트가 한꺼번에 바뀐다.

이 성질이 왜 중요한지는 회전 각도 센서 같은 하드웨어에서 드러난다. 만약 물리적인 센서가 순수 2진수로 값을 읽어 내는데, 회로 부품마다 반응 속도가 미세하게 다르면 3에서 4로 바뀌는 순간 세 비트가 완벽히 동시에 바뀌지 못하고 010이나 101 같은 엉뚱한 중간값이 순간적으로 읽힐 위험이 있다. 그레이 코드는 한 번에 한 비트만 바뀌므로 이런 위험이 원천적으로 없다.

10진 숫자순수 2진수그레이 코드
000000000
100010001
200100011
300110010
401000110
501010111
601100101
701110100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

표를 자세히 보면 인접한 두 행(예: 2와 3, 6과 7)의 그레이 코드는 항상 정확히 1비트만 다르다. 심지어 마지막 값 15(1000)에서 다시 처음 값 0(0000)으로 순환할 때도 1비트만 바뀐다는 점이 그레이 코드의 또 다른 장점이다.

순수 2진수를 그레이 코드로 바꾸는 규칙

순수 2진수를 그레이 코드로 바꾸는 절차는 다음과 같다.

1단계: 최상위 비트는 그대로 옮긴다

2진수의 가장 왼쪽 비트(최상위 비트)는 그레이 코드에서도 그대로 최상위 비트가 된다.

2단계: 그 다음 비트부터는 바로 왼쪽 비트와 배타적 논리합(XOR)을 취한다

2진수의 ii번째 비트와 바로 왼쪽인 (i1)(i-1)번째 비트를 XOR 연산한 결과가 그레이 코드의 ii번째 비트가 된다. XOR은 두 값이 서로 다르면 1, 같으면 0이 되는 연산이다(자세한 논리 연산 규칙은 09편에서 다룬다).

3단계: 마지막 비트까지 반복한다

가장 오른쪽(최하위) 비트까지 이 규칙을 반복하면 전체 그레이 코드가 완성된다.

예제: 2진수 0110을 그레이 코드로 변환

2진수 0110의 각 비트를 왼쪽부터 b3b2b1b0=0110b_3 b_2 b_1 b_0 = 0110이라 하자.

  • 그레이 코드의 g3g_3: 최상위 비트를 그대로 옮기므로 g3=b3=0g_3 = b_3 = 0
  • 그레이 코드의 g2g_2: b3b_3b2b_2의 XOR, 즉 0과 1이 다르므로 g2=1g_2 = 1
  • 그레이 코드의 g1g_1: b2b_2b1b_1의 XOR, 즉 1과 1이 같으므로 g1=0g_1 = 0
  • 그레이 코드의 g0g_0: b1b_1b0b_0의 XOR, 즉 1과 0이 다르므로 g0=1g_0 = 1

따라서 0110(2진수 6)의 그레이 코드는 0101이며, 위 표에서 10진수 6의 그레이 코드 0101과 정확히 일치한다.

그레이 코드를 순수 2진수로 되돌리는 규칙

반대 방향은 다음과 같다.

1단계: 최상위 비트는 그대로 옮긴다

그레이 코드의 최상위 비트는 2진수에서도 그대로 최상위 비트가 된다.

2단계: 직전에 구한 2진수 비트와 현재 그레이 코드 비트를 XOR한다

한 단계 앞서 이미 구한 2진수 비트와, 현재 위치의 그레이 코드 비트를 XOR한 결과가 그 위치의 2진수 비트가 된다.

3단계: 마지막 비트까지 반복한다

즉 그레이 코드를 2진수로 바꿀 때는 “바로 왼쪽 그레이 코드 비트”가 아니라 직전에 구한 2진수 비트를 사용한다는 점이 순방향 변환과의 차이이며, 이 차이를 혼동하는 것이 시험에서 자주 나오는 함정이다.

쉽게 말하면: 2진수를 그레이 코드로 바꿀 때는 “2진수의 이웃끼리” XOR하고, 그레이 코드를 2진수로 되돌릴 때는 “방금 구한 2진수 결과”와 XOR한다.

여분3 코드 — BCD에 3을 더한 자기보수 코드

여분3 코드(Excess-3 code, XS-3라고도 부른다)는 10진 숫자 0~9 각각에 3을 더한 값을 4비트 2진수로 표현한 코드다. 예를 들어 10진수 0은 0+3=3이므로 0011, 10진수 5는 5+3=8이므로 1000이 된다.

10진 숫자BCD여분3 코드
000000011
100010100
200100101
300110110
401000111
501011000
601101001
701111010
810001011
910011100

여분3 코드의 가장 중요한 특징은 자기보수성(self-complementing)이다. 어떤 10진 숫자 dd의 여분3 코드에서 모든 비트를 반전(0은 1로, 1은 0으로)시키면, 그 결과가 9d9-d에 해당하는 여분3 코드와 정확히 같아진다. 예를 들어 10진수 3의 여분3 코드는 0110인데, 이를 모두 반전하면 1001이 되고, 이는 표에서 93=69-3=6의 여분3 코드 1001과 정확히 일치한다.

이 자기보수 성질은 10진 뺄셈을 비트 반전만으로 간단히 처리할 수 있는 회로를 설계할 때 유용하게 쓰인다(자세한 활용은 08편의 보수 연산에서 다시 연결된다). BCD 코드는 이런 자기보수 성질을 갖지 않는다는 점도 비교해서 기억해 두자. 예를 들어 3의 BCD 0011을 반전하면 1100인데, 이는 93=69-3=6의 BCD 0110과 다르다.

쉽게 말하면: 여분3 코드는 BCD에 그냥 3을 더한 것처럼 보이지만, 그 덕분에 “비트를 뒤집기만 해도 9에서 뺀 값이 나온다”는 아주 편리한 대칭성을 얻는다.

세 코드의 특징 비교

코드만들어진 목적핵심 특징사용하는 비트 조합 수
BCD10진 숫자를 그대로 다루는 장치 지원각 10진 자리를 독립된 4비트로 저장10가지(0000–1001)
그레이 코드값이 바뀔 때 오작동 방지인접한 값 사이에 1비트만 변화16가지 전부 사용 가능
여분3 코드10진 뺄셈 회로 단순화비트 반전만으로 9의 보수를 구하는 자기보수성10가지(0011–1100)

자주 틀리는 점

  • BCD를 순수 2진수처럼 통째로 읽는 실수: BCD는 4비트씩 끊어서 각각 하나의 10진 자리로 읽어야 하며, 전체 비트열을 하나의 2진수로 취급해 자리값 공식을 적용하면 안 된다.
  • BCD 덧셈에서 보정을 잊는 실수: 순수 2진 덧셈 결과가 9를 초과하거나 자리올림이 발생하면 반드시 6을 더해 보정해야 유효한 BCD 값이 된다.
  • 2진수를 그레이 코드로, 그레이 코드를 2진수로 바꾸는 절차를 헷갈리는 실수: 순방향(2진→그레이)은 원래 2진수의 이웃 비트끼리 XOR하고, 역방향(그레이→2진)은 직전에 구한 2진수 결과와 XOR한다. 이 방향 차이를 정확히 구분해야 한다.
  • BCD와 여분3 코드를 혼동하는 실수: 두 코드는 숫자만 보면 비슷해 보이지만, 여분3은 BCD보다 정확히 3(0011)만큼 큰 값을 쓴다는 점과, 자기보수성을 갖는다는 점에서 명확히 구분된다.

핵심 정리

  • BCD 코드는 10진수의 각 자리를 독립적으로 4비트 2진수로 부호화하며, 1010부터 1111까지는 사용하지 않는 잉여 코드다. 덧셈 시 결과가 9를 초과하거나 자리올림이 생기면 6을 더해 보정한다.
  • 그레이 코드는 연속된 값 사이에 오직 1비트만 바뀌는 인접 코드로, 순수 2진수와의 상호 변환은 XOR 연산을 이용한 규칙(순방향은 이웃 비트끼리, 역방향은 직전 결과와)으로 이루어진다.
  • 여분3 코드는 BCD에 3을 더한 코드로, 비트를 모두 반전하면 9에서 뺀 값의 코드가 되는 자기보수성을 갖는다.
  • 세 코드 모두 순수 2진수만으로 해결하기 어려운 실제 필요(사람이 읽는 10진 표시, 오작동 방지, 뺄셈 회로 단순화)에서 출발했다는 공통점이 있다.

마무리 복습

문제 14지선다
BCD 코드에 대한 설명으로 옳은 것은?
문제 24지선다
BCD 덧셈에서 순수 2진 덧셈 결과가 9를 초과하거나 자리올림이 발생했을 때 해야 할 보정으로 옳은 것은?
문제 34지선다
그레이 코드가 순수 2진수와 구별되는 핵심 특징으로 옳은 것은?
문제 44지선다
순수 2진수 0110을 그레이 코드로 변환한 결과로 옳은 것은?
문제 54지선다
여분3 코드의 자기보수성에 대한 설명으로 옳은 것은?
문제 64지선다
10진수 5를 여분3 코드로 변환한 결과로 옳은 것은?

참고 자료

Last updated on