디지털 시스템에서 10진수를 2진수로 표현할 때 BCD(Binary Coded Decimal) 코드를 사용한다. BCD는 10진수 한 자리(0~9)를 4비트로 매핑하는 방식이며, 각 비트에 부여된 가중치에 따라 여러 종류가 있다.
가중치 코드
4비트 값 b3 b2 b1 b0의 10진 값은 각 비트에 가중치 w3, w2, w1, w0를 곱한 합으로 결정된다.
값 = b3×w3 + b2×w2 + b1×w1 + b0×w08-4-2-1 코드는 가장 기본적인 BCD 코드로, 가중치가 일반 2진수 자릿값과 동일하다. 예를 들어 10진수 7은 0111 → 0×8 + 1×4 + 1×2 + 1×1 = 7이 된다.
순수 2진수 변환과 달리 BCD는 10진수 각 자리를 독립적으로 4비트에 매핑하기 때문에 변환이 직관적이다.
- 10진수
59→ 순수 2진수:111011(나눗셈 필요) - 10진수
59→ BCD:0101 1001(5→0101, 9→1001)
디지털 시계, 계산기, 디스플레이 구동 회로 등 10진수를 직접 다루는 하드웨어에서 주로 쓰인다.
자기보수 코드
자기보수(Self-Complementing) 코드는 어떤 10진수 N의 코드에서 모든 비트를 반전하면 9-N(9의 보수)이 되는 코드이다. 별도의 뺄셈 회로 없이 비트 반전만으로 9의 보수를 구할 수 있어 연산 회로 설계가 단순해진다.
자기보수 코드의 조건
가중치의 합이 9여야 한다.
w3 + w2 + w1 + w0 = 9모든 비트가 1일 때 값이 9가 되어야 비트 전체 반전 시 0(모든 비트 0)과 대응되고, 그 사이의 모든 N ↔ 9-N 관계가 성립하기 때문이다.
8 4 -2 -1 코드
가중치 합이 8 + 4 + (-2) + (-1) = 9이므로 자기보수 코드이다. 0~9 매핑은 다음과 같다.
- 0:
0000→ 0 - 1:
0111→ 4-2-1 = 1 - 2:
0110→ 4-2 = 2 - 3:
0101→ 4-1 = 3 - 4:
0100→ 4 - 5:
1011→ 8-2-1 = 5 - 6:
1010→ 8-2 = 6 - 7:
1001→ 8-1 = 7 - 8:
1000→ 8 - 9:
1111→ 8+4-2-1 = 9
비트 반전으로 자기보수가 성립하는지 확인해보면:
3=0101→ 반전 →1010= 8-2 =6(= 9-3)2=0110→ 반전 →1001= 8-1 =7(= 9-2)4=0100→ 반전 →1011= 8-2-1 =5(= 9-4)
모든 쌍(0↔9, 1↔8, 2↔7, 3↔6, 4↔5)이 비트 반전 관계이다.
2-4-2-1 코드
가중치 합이 2 + 4 + 2 + 1 = 9이므로 역시 자기보수 코드이다.
반례: 5-4-2-1 코드
가중치 합이 5 + 4 + 2 + 1 = 12 ≠ 9이므로 자기보수 코드가 아니다.
Excess-3 코드
BCD 값에 3을 더한 비가중치 코드이다. 가중치가 없지만 자기보수 성질을 가진다. 예를 들어 10진수 0은 BCD 0000에 3을 더한 0011, 9는 1001에 3을 더한 1100이 되고, 이 둘은 비트 반전 관계이다.
Gray 코드
Gray 코드는 인접한 두 값 사이에서 정확히 1비트만 변하도록 설계된 비가중치 코드이다. 일반 2진수에서는 0111(7) → 1000(8)처럼 한 번에 4비트가 동시에 바뀌는 경우가 있는데, 실제 회로에서는 각 비트의 전환 시점에 미세한 차이가 있어 순간적으로 엉뚱한 중간값이 나타날 수 있다. Gray 코드는 이 문제를 원천적으로 제거한다.
4비트 Gray 코드
10진수 2진수 Gray 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인접한 행끼리 비교하면 항상 1비트만 다르다. 마지막 값 1000(15)과 처음 값 0000(0) 사이에서도 1비트만 다르므로, 순환 구조에서도 안전하다.
2진수 → Gray 변환
최상위 비트는 그대로 유지하고, 나머지 비트는 2진수의 인접한 두 비트를 XOR하면 된다.
2진수: b3 b2 b1 b0Gray: b3 b3⊕b2 b2⊕b1 b1⊕b0예시: 2진수 1010 → Gray 1 1⊕0=1 0⊕1=1 1⊕0=1 → 1111
Gray → 2진수 변환
최상위 비트는 그대로 유지하고, 이후 비트는 직전에 구한 2진수 비트와 현재 Gray 비트를 XOR한다.
Gray: g3 g2 g1 g02진수: g3 g3⊕g2 (g3⊕g2)⊕g1 ((g3⊕g2)⊕g1)⊕g0예시: Gray 1111 → 1 1⊕1=0 0⊕1=1 1⊕1=0 → 2진수 1010
활용
- 회전 인코더: 축의 회전 각도를 감지하는 센서에서 위치를 읽을 때, 일반 2진수를 쓰면 경계에서 여러 비트가 동시에 바뀌며 잘못된 위치가 순간적으로 읽힐 수 있다. Gray 코드는 1비트만 바뀌므로 이런 글리치가 발생하지 않는다.
- A/D 변환기: 아날로그 신호를 디지털로 변환할 때 경계값 근처에서의 오류를 줄인다.
- 카르노 맵: 논리 회로 간소화에 쓰이는 카르노 맵의 축 순서가 Gray 코드 순서이다. 인접 셀끼리 1비트만 다르게 배치해야 인접항 묶기가 가능하기 때문이다.
- 오류 최소화: 전송 중 1비트 오류가 발생해도 인접한 값으로만 틀리므로, 오류의 크기가 최소화된다.