그레이 코드 변환 쉽게 이해하기 — 개념과 원리
그레이 코드(반사 2진 부호)는 이웃한 두 값이 정확히 한 비트만 다르게 수를 배열한 부호입니다. 일반 2진수는 7(0111)에서 8(1000)로 넘어갈 때 네 비트가 동시에 바뀌므로, 그 순간에 센서를 읽으면 전혀 엉뚱한 값이 나올 수 있습니다. 그래서 그레이 코드는 회전·직선 위치 인코더, 카르노 맵, 디지털 회로에서 클록 영역을 넘나드는 카운터 등에 쓰입니다. 이 도구는 10진수를 2진수와 그레이 코드로 바꾸고, 입력 비트를 그레이 코드로 보고 2진수로 되돌린 값도 함께 보여 줍니다.
계산 방법
- 2진수 → 그레이: G = n XOR (n >> 1)입니다. 각 비트를 바로 왼쪽 비트와 XOR하며, 맨 앞 비트는 그대로 둡니다.
- 그레이 → 2진수: 맨 위 비트부터 b(i) = g(i) XOR b(i+1)로 내려옵니다. 값을 오른쪽으로 1, 2, 3… 칸 민 것들을 모두 XOR해도 같습니다.
원리
반사 구성법을 보면 한 비트만 바뀌는 이유가 드러납니다. k비트 그레이 목록을 쓰고 그 아래에 거꾸로 한 번 더 쓴 뒤, 앞 절반에는 0, 뒤 절반에는 1을 붙입니다. 각 절반 안에서는 이미 한 비트씩만 다르고, 이음매의 두 값은 새로 붙인 비트만 다릅니다. XOR 공식은 이 구성의 지름길로, 그레이 비트는 2진수에서 이웃 비트가 바뀌는 자리에만 1이 됩니다. 1을 더하면 끝쪽 비트들이 한꺼번에 뒤집히지만 '바뀌는 자리'는 하나만 달라지므로 그레이 코드에서는 한 비트만 변합니다.
예제 풀이
- 입력 13은 2진수 1101입니다.
- 오른쪽으로 한 칸 밀면 13 >> 1 = 6 = 0110입니다.
- 그레이 코드는 1101 XOR 0110 = 1011(10진수 11)입니다.
- 이번에는 1101을 그레이 코드로 보고 풀면 b3 = 1, b2 = 1 XOR 1 = 0, b1 = 0 XOR 0 = 0, b0 = 1 XOR 0 = 1로 1001입니다.
- 13 ^ 6 ^ 3 ^ 1 = 9로 확인되어 결과는 1001 (9)입니다.
| 10진수 | 2진수 |
|---|---|
| 3.25 | 11.01 |
| 6.5 | 110.1 |
| 9.75 | 1001.11 |
| 13 | 1101 |
| 16.2 | 10000.01 |
| 19.5 | 10011.1 |
| 26 | 11010 |
결과 해석
그레이 코드 출력은 인코더가 13번 위치에서 내보내는 비트 패턴입니다. 세 번째 줄은 반대 질문의 답으로, 장치가 1101을 보고하면 실제 위치는 9라는 뜻입니다. 변환한 값을 다시 풀면 언제나 원래 수가 나옵니다.
흔한 실수
- 음수에 그레이 변환을 적용하는 것(그레이 코드는 0 이상의 정수에 정의됩니다)
- 풀 때 g ^ (g >> 1) 한 번만 계산하는 것(이는 다시 부호화하는 것입니다)
- 그레이 패턴을 일반 2진수로 읽어 크기를 비교하는 것
자주 묻는 질문
회전 인코더에 그레이 코드를 쓰는 이유는 무엇입니까?
기계 접점은 정확히 동시에 바뀌지 않습니다. 한 번에 한 비트만 바뀌면 전환 중에 읽어도 오차가 한 칸 이내입니다.
카르노 맵에서는 어떻게 씁니까?
행과 열을 00, 01, 11, 10 순서로 붙여 이웃 칸이 변수 하나만 다르게 하므로 묶음을 찾기 쉽습니다.
그레이 코드는 n마다 하나뿐입니까?
표준 반사 2진 부호는 일대일 대응이라 n마다 정확히 하나입니다.
출처: F. Gray, Pulse Code Communication, U.S. Patent 2,632,058 (1953) · M. Morris Mano and Michael D. Ciletti, Digital Design, Pearson