BCD 변환 쉽게 이해하기 — 개념과 원리
2진화 10진수(BCD)는 수 전체를 2진수로 바꾸지 않고 10진수의 각 자리를 4비트씩 따로 저장하는 방식입니다. 공간은 조금 더 들지만 나눗셈 없이 자릿수를 바로 표시할 수 있고, 10진 금액을 오차 없이 나타냅니다. 7세그먼트 표시 장치 구동 회로, 여러 실시간 시계 칩, 일부 금융·메인프레임 데이터 형식, 디지털 논리 교과 과정에서 만날 수 있습니다. 이 도구는 10진수를 8421 BCD와 3초과 코드로 바꾸어 줍니다.
계산 방법
- BCD(8421): 각 자리 숫자를 가중치 8, 4, 2, 1의 4비트 2진수로 씁니다.
- 3초과 코드: 각 자리에 3을 더한 뒤 4비트로 씁니다. 0은 0011, 9는 1100이 됩니다.
- 입력의 절댓값에서 정수 부분만 변환하며, 부호와 소수 부분은 부호화하지 않습니다.
원리
4비트는 16가지 패턴을 담지만 10진 숫자는 10개뿐이므로, BCD는 0000~1001만 쓰고 1010~1111은 비워 둡니다. 한 니블이 한 자리이므로 두 자리를 한 바이트에 넣은 팩 BCD는 16진수로 읽어도 10진수와 똑같이 보입니다. 시계 레지스터의 0x59가 59초를 뜻하는 이유입니다. 3초과 코드는 자기 보수 성질이 있어 모든 비트를 뒤집으면 (9 − 그 숫자)의 코드가 되므로, 초기 10진 계산기에서 뺄셈을 쉽게 해 주었습니다. BCD끼리 더해 한 자리가 9를 넘으면 비어 있는 여섯 패턴을 건너뛰도록 6을 더해 보정합니다.
예제 풀이
- 입력 2026의 각 자리는 2, 0, 2, 6입니다.
- BCD는 2 = 0010, 0 = 0000, 2 = 0010, 6 = 0110으로 0010 0000 0010 0110입니다.
- 3초과 코드는 각 자리에 3을 더해 5, 3, 5, 9를 얻습니다.
- 이를 4비트로 쓰면 0101 0011 0101 1001입니다.
- 마지막 자리 1001을 모두 뒤집으면 0110 = 3 + 3이 되어, 9 − 6 = 3의 코드와 일치합니다.
결과 해석
출력은 왼쪽부터 4비트씩 끊어 읽으며, 한 묶음이 10진수 한 자리입니다. 바이트로 묶으면 2026은 0x20 0x26입니다. 2026을 그냥 2진수로 쓰면 11111101010, 11비트면 되지만 BCD는 16비트가 필요합니다. 일반적으로 2진수는 한 자리에 약 3.32비트(log₂ 10)면 되므로, BCD는 10진 처리가 쉬운 대신 저장 공간을 20%쯤 더 씁니다.
흔한 실수
- 수 전체를 2진수로 바꾼 것을 BCD라고 부르는 것
- 1010~1111을 올바른 BCD 숫자로 받아들이는 것
- BCD를 일반 2진 덧셈으로 더하고 +6 보정을 빠뜨리는 것
자주 묻는 질문
시계 칩은 왜 BCD를 씁니까?
2진수 변환 없이 자리마다 바로 표시 장치로 보낼 수 있기 때문입니다.
BCD는 16진수와 같습니까?
같지 않습니다. 다만 각 니블에 0~9만 쓰이므로 팩 BCD 바이트를 16진수로 쓰면 10진수처럼 보입니다.
0의 3초과 코드는 무엇입니까?
0 + 3 = 3이므로 0011입니다.
출처: M. Morris Mano and Michael D. Ciletti, Digital Design, Pearson