그레이 코드 (Gray Code)
그레이 코드(Gray Code)는 이진 코드 값을 배열한 것으로, 값의 시퀀스를 한 단계씩 진행할 때마다 정확히 하나의 비트만 바뀝니다. 즉 인접한 두 수가 한 자리만 다르도록 수를 부호화하는 방식입니다. 이 용어는 종종 “반사” 코드, 또는 더 구체적으로 바이너리 반사 그레이 코드를 지칭하는 데 사용됩니다.
그레이 코드가 특별한 이유는?
그레이 코드는 인접한 숫자가 단 하나의 비트만 다르다는 점에서 두각을 나타냅니다. 각 고리가 이진수를 나타내고, 다음 고리로 넘어갈 때 단 하나의 요소만 바뀌는 사슬과 같습니다. 이러한 특성 덕분에 그레이 코드는 상태가 순서대로 바뀌는 하드웨어에서 널리 쓰입니다.
한 번에 한 비트
하나의 조합에서 다음 조합으로 이동하려면 단 하나의 숫자만 변경하면 됩니다.
- 예를 들어, 일반 이진수에서는 01에서 10으로 넘어갈 때 두 비트가 모두 바뀌지만, 2비트 그레이 코드(00, 01, 11, 10)에서는 01 다음이 11이므로 첫 번째 비트만 바뀝니다.
이진 코드로 위치를 알려 주는 센서를 예로 들어 보겠습니다. 일반적인 이진 시퀀스에서는 여러 비트가 동시에 바뀌어야 하는데, 실제 회로에서는 비트들이 정확히 같은 순간에 바뀌지 않으므로 전환 도중 전혀 다른 값이 잠깐 읽힐 수 있습니다. 그레이 코드는 한 단계에 한 비트만 바뀌도록 보장하므로, 전환 중에 읽더라도 이전 값이나 다음 값 중 하나만 나옵니다.
“반사” 코드란
“그레이 코드”라는 용어는 보통 바이너리 반사 그레이 코드를 가리킵니다. 거울을 떠올리면 이해하기 쉽습니다.
- 간단한 시퀀스: 0, 1로 시작합니다.
- 그런 다음 “반사”합니다(거울 이미지와 같음): 1, 0
- 마지막으로, 첫 번째 절반의 각 코드 앞에 ‘0’을 추가하고 두 번째 절반의 각 코드 앞에 ‘1’을 추가합니다: 00, 01, 11, 10
이 “반사” 패턴을 반복하면 더 긴 그레이 코드를 만들 수 있습니다. 예를 들어 3비트 코드는 000, 001, 011, 010, 110, 111, 101, 100입니다. 이진수 b를 그레이 코드로 바꿀 때는 b와 b를 오른쪽으로 한 비트 민 값을 배타적 논리합(XOR)하면 됩니다.
장점과 한계
- 전환 오류 최소화: 각 단계마다 하나의 비트만 변경되므로 상태 간 전환이 자주 발생하는 디지털 시스템에서 잘못 읽힐 가능성이 줄어듭니다.
- 단순화된 회로 설계: 로터리 인코더 및 아날로그-디지털 변환기(ADC)와 같은 하드웨어 회로를 설계하는 데 유용합니다. 동시에 바뀌는 비트가 적어 스위칭에 따른 전력 소비도 줄일 수 있습니다.
- 직접적인 산술 연산 부족: 그레이 코드는 이진법으로 다시 변환하지 않고는 덧셈 및 뺄셈과 같은 직접적인 산술 연산을 지원하지 않으므로 일부 계산 작업이 복잡해집니다.
- 변환 비용: 이진 코드와 그레이 코드 간의 변환 프로세스는 소프트웨어 및 하드웨어 구현 모두에서 추가적인 계산 오버헤드를 발생시킬 수 있습니다.
- 오류 정정 부호가 아님: 그레이 코드는 전환 순간의 오독을 줄일 뿐, 잡음으로 생긴 비트 오류를 검출하거나 고치지는 못합니다. 그런 목적에는 해밍 코드 같은 오류 정정 부호를 씁니다.
다양한 분야에서의 응용
- 로터리 인코더: 단계별로 하나의 비트만 변경되도록 하여 위치 감지 장치의 설계를 단순화하고, 접점이 정확히 같은 순간에 바뀌지 않아 생기는 오독을 줄입니다.
- D/A·A/D 변환기: 변환 경계에서 여러 비트가 한꺼번에 바뀌며 생기는 순간적인 잘못된 값(글리치)을 줄이는 데 쓰입니다.
- 메모리 주소 지정: 순차 접근이 필요한 하드웨어 구성 요소의 주소를 지정할 때 유용하며, 한 번에 한 주소선만 바뀌므로 전환 잡음과 전력 소비를 줄입니다.
이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.