도구스개발

그레이 코드 변환기

이진수와 그레이 코드를 서로 바꾸고 대조표를 그립니다. 이웃한 값이 한 비트만 다르다는 성질을 표에서 바로 확인할 수 있습니다.

비트

표시할 자리수입니다. 계산 자체는 자리수와 무관합니다

그레이 코드

0111

10진수 7 · 16진수 0x7

이진값0101 (5)
그레이 코드0111 (7)
16진수0x5 → 0x7
앞 값 4에서 바뀐 비트 — 그레이 코드1비트 (0번 자리)
같은 자리에서 보통의 이진수라면1비트
계산 근거g = b XOR (b >> 1) = 0101 XOR 0010 = 0111b = g XOR (g>>1) XOR (g>>2) XOR … = 0101정변환은 자기 자신과 한 칸 민 값을 XOR 하는 한 줄이고, 역변환은 상위 비트부터 누적 XOR입니다. 둘 다 확정적이라 근사가 끼어들 여지가 없습니다.

4비트 대조표

10진이진그레이그레이 변화이진 변화
000000000
1000100011비트1비트
2001000111비트2비트
3001100101비트1비트
4010001101비트3비트
5010101111비트1비트
6011001011비트2비트
7011101001비트1비트
8100011001비트4비트
9100111011비트1비트
10101011111비트2비트
11101111101비트1비트
12110010101비트3비트
13110110111비트1비트
14111010011비트2비트
15111110001비트1비트

그레이 쪽은 모든 행에서 정확히 1비트만 바뀝니다. 이진 쪽은 3→4에서 3비트, 7→8에서 4비트가 한꺼번에 바뀝니다.

로터리 엔코더가 그레이 코드를 쓰는 이유가 여기 있습니다. 원판에 이진수를 새겨 각도를 읽을 때, 여러 비트가 동시에 바뀌는 경계에 브러시가 걸치면 비트마다 읽히는 시점이 조금씩 어긋납니다. 011에서 100으로 넘어가는 순간 111이나 000이 읽힐 수 있고, 각도 3과 4 사이에서 7이나 0이 튀어나옵니다. 그레이 코드는 한 번에 한 비트만 바뀌므로 경계에서 읽어도 이전 값 아니면 다음 값이지 엉뚱한 값이 되지 않습니다.
마지막 값과 첫 값도 한 비트만 다릅니다. 그래서 원판처럼 한 바퀴 도는 것에 쓸 수 있습니다. "반사 이진 코드"라는 이름은 만드는 방법에서 왔는데, n−1비트 표를 그대로 쓴 뒤 거울에 비춘 것처럼 뒤집어 이어 붙이고 앞쪽에 0, 뒤쪽에 1을 붙이면 n비트 표가 됩니다. 뒤집어 붙이는 지점에서 앞 비트만 바뀌기 때문에 이웃 조건이 유지됩니다.
카르노 맵의 행과 열을 그레이 코드 순서로 늘어놓는 것도 같은 이유입니다. 이웃한 칸이 변수 하나만 다르게 만들어야 인접한 1들을 묶을 수 있기 때문입니다. 00·01·11·10 순서가 그레이 코드입니다.
이 계산기는 32비트까지 다룹니다. 자바스크립트의 비트 연산이 32비트 정수로 잘려서 그 위는 값이 잘리거나 부호가 뒤집히기 때문입니다. 엔코더와 카르노 맵 용도로는 충분하지만, 더 큰 값이 필요하시면 BigInt를 쓰는 구현이 따로 필요합니다.

사용 방법

  1. 1이진값과 그레이 코드 중 어느 쪽을 넣을지 고릅니다.
  2. 2표시할 비트 수를 고르고 값을 넣습니다.
  3. 3대조표에서 이웃한 값이 정확히 한 비트만 다른 것을 확인할 수 있습니다.

자주 묻는 질문

이진값을 그레이 코드로 바꿀 때는 g = b XOR (b >> 1)입니다. 자기 자신과 한 칸 오른쪽으로 민 값을 XOR하면 됩니다. 되돌릴 때는 g XOR (g>>1) XOR (g>>2) XOR …처럼 상위 비트부터 누적 XOR을 합니다. 예를 들어 5(0101)는 그레이 코드로 7(0111)입니다.

이웃한 두 값이 정확히 한 비트만 다르기 때문입니다. 보통의 이진수는 3(011)에서 4(100)로 넘어갈 때 세 비트가 한꺼번에 바뀌는데, 절대형 로터리 엔코더에서 이런 경계에 브러시가 걸치면 비트마다 읽히는 시점이 어긋나 111이나 000 같은 엉뚱한 값이 읽힙니다. 그레이 코드는 한 비트만 바뀌므로 경계에서 읽어도 이전 값 아니면 다음 값입니다.

만드는 방법에서 온 이름입니다. n−1비트 표를 그대로 쓴 뒤 거울에 비춘 것처럼 뒤집어 이어 붙이고, 앞쪽 절반에는 0을 뒤쪽 절반에는 1을 앞에 붙이면 n비트 표가 됩니다. 뒤집어 붙이는 지점에서 앞 비트 하나만 바뀌기 때문에 이웃 조건이 유지됩니다.

그렇습니다. 4비트라면 15의 그레이 코드가 1000이고 0의 그레이 코드가 0000이라 한 비트만 다릅니다. 이 순환 성질 덕분에 원판처럼 한 바퀴 도는 것에 쓸 수 있습니다. 반사 구조로 만들었기 때문에 나오는 성질입니다.

그것이 2비트 그레이 코드이기 때문입니다. 이웃한 칸이 변수 하나만 다르게 만들어야 인접한 1들을 하나로 묶을 수 있는데, 00·01·10·11처럼 보통의 순서로 적으면 01과 10이 두 변수나 달라져 묶을 수 없습니다.

이 계산기는 32비트까지만 다룹니다. 자바스크립트의 비트 연산이 32비트 정수로 잘려서 그 위는 값이 잘리거나 부호가 뒤집히기 때문입니다. 엔코더와 카르노 맵 용도로는 충분하며, 더 큰 값이 필요하면 BigInt를 쓰는 구현이 따로 필요합니다.

전송되지 않습니다. 모든 변환은 브라우저 안에서만 이루어지고, 넣으신 값은 이 기기를 벗어나지 않습니다.

알아두면 좋은 점

  • 32비트까지 다룹니다. 자바스크립트 비트 연산의 한계 때문입니다.
  • 음수와 소수는 다루지 않습니다.
  • 여기서 다루는 것은 표준적인 반사 이진 코드입니다. 균형 그레이 코드나 n항 그레이 코드 같은 변형은 범위 밖입니다.

함께 보면 좋은 도구

마지막 검증: 2026년 8월 31일 · 결과는 참고용 추정치입니다.