이번 문서의 목표: 이 문서를 다 읽으면 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비트는 가지 조합을 만들 수 있지만, BCD는 그중 0000(0)부터 1001(9)까지 10가지만 사용하고 나머지 1010(10)부터 1111(15)까지 6가지는 사용하지 않는다. 이렇게 정해진 코드 없이 남겨 둔 조합을 잉여 코드(또는 무효 코드, invalid code)라고 부른다.
| 10진 숫자 | BCD (4비트) |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
예제: 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비트를 순서로 계산해야 하지만, 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진수 | 그레이 코드 |
|---|---|---|
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |
| 5 | 0101 | 0111 |
| 6 | 0110 | 0101 |
| 7 | 0111 | 0100 |
| 8 | 1000 | 1100 |
| 9 | 1001 | 1101 |
| 10 | 1010 | 1111 |
| 11 | 1011 | 1110 |
| 12 | 1100 | 1010 |
| 13 | 1101 | 1011 |
| 14 | 1110 | 1001 |
| 15 | 1111 | 1000 |
표를 자세히 보면 인접한 두 행(예: 2와 3, 6과 7)의 그레이 코드는 항상 정확히 1비트만 다르다. 심지어 마지막 값 15(1000)에서 다시 처음 값 0(0000)으로 순환할 때도 1비트만 바뀐다는 점이 그레이 코드의 또 다른 장점이다.
순수 2진수를 그레이 코드로 바꾸는 규칙
순수 2진수를 그레이 코드로 바꾸는 절차는 다음과 같다.
1단계: 최상위 비트는 그대로 옮긴다
2진수의 가장 왼쪽 비트(최상위 비트)는 그레이 코드에서도 그대로 최상위 비트가 된다.
2단계: 그 다음 비트부터는 바로 왼쪽 비트와 배타적 논리합(XOR)을 취한다
2진수의 번째 비트와 바로 왼쪽인 번째 비트를 XOR 연산한 결과가 그레이 코드의 번째 비트가 된다. XOR은 두 값이 서로 다르면 1, 같으면 0이 되는 연산이다(자세한 논리 연산 규칙은 09편에서 다룬다).
3단계: 마지막 비트까지 반복한다
가장 오른쪽(최하위) 비트까지 이 규칙을 반복하면 전체 그레이 코드가 완성된다.
예제: 2진수 0110을 그레이 코드로 변환
2진수 0110의 각 비트를 왼쪽부터 이라 하자.
- 그레이 코드의 : 최상위 비트를 그대로 옮기므로
- 그레이 코드의 : 과 의 XOR, 즉 0과 1이 다르므로
- 그레이 코드의 : 와 의 XOR, 즉 1과 1이 같으므로
- 그레이 코드의 : 과 의 XOR, 즉 1과 0이 다르므로
따라서 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 코드 |
|---|---|---|
| 0 | 0000 | 0011 |
| 1 | 0001 | 0100 |
| 2 | 0010 | 0101 |
| 3 | 0011 | 0110 |
| 4 | 0100 | 0111 |
| 5 | 0101 | 1000 |
| 6 | 0110 | 1001 |
| 7 | 0111 | 1010 |
| 8 | 1000 | 1011 |
| 9 | 1001 | 1100 |
여분3 코드의 가장 중요한 특징은 자기보수성(self-complementing)이다. 어떤 10진 숫자 의 여분3 코드에서 모든 비트를 반전(0은 1로, 1은 0으로)시키면, 그 결과가 에 해당하는 여분3 코드와 정확히 같아진다. 예를 들어 10진수 3의 여분3 코드는 0110인데, 이를 모두 반전하면 1001이 되고, 이는 표에서 의 여분3 코드 1001과 정확히 일치한다.
이 자기보수 성질은 10진 뺄셈을 비트 반전만으로 간단히 처리할 수 있는 회로를 설계할 때 유용하게 쓰인다(자세한 활용은 08편의 보수 연산에서 다시 연결된다). BCD 코드는 이런 자기보수 성질을 갖지 않는다는 점도 비교해서 기억해 두자. 예를 들어 3의 BCD 0011을 반전하면 1100인데, 이는 의 BCD 0110과 다르다.
쉽게 말하면: 여분3 코드는 BCD에 그냥 3을 더한 것처럼 보이지만, 그 덕분에 “비트를 뒤집기만 해도 9에서 뺀 값이 나온다”는 아주 편리한 대칭성을 얻는다.
세 코드의 특징 비교
| 코드 | 만들어진 목적 | 핵심 특징 | 사용하는 비트 조합 수 |
|---|---|---|---|
| BCD | 10진 숫자를 그대로 다루는 장치 지원 | 각 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진 표시, 오작동 방지, 뺄셈 회로 단순화)에서 출발했다는 공통점이 있다.
마무리 복습
참고 자료
- 국가평생교육진흥원 독학학위제 — 독학사 2단계 논리회로 평가영역과 학습정보를 확인할 수 있는 공식 자료.
- IEEE — 디지털 코드 체계와 표준화 관련 자료를 제공하는 국제 표준화 기구.