그레이 코드란 숫자를 표기하는 2진 표기법 중 하나이다.
10진수 | 2진수(바이너리 코드) | 그레이 코드 |
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 |
[2진수와 그레이 코드 차이점]
10진수 3 --> 4 로 값이 1이 증가하는 경우에
바이너리코드 0011 --> 0100 즉 [2:0]번 bit들의 값이 바뀌었다.
(물론, 10진수 4 --> 5로 값이 1 증가하는 경우에
바이너리코드 0100 --> 0110 [1]번 bit의 값만 바뀌기도 한다.)
즉, 값이 1씩 증가하거나, 1씩 감소할 때 바뀌는 bit의 갯수는 그때그때마다 다르다.
반면에
그레이 코드의 경우엔 항상 하나의 bit만 바뀐다.
10진수 0 --> 1 로 값이 1이 증가하는 경우에
그레이코드는 0000 --> 0001 즉 [0]번 bit의 값만 바뀌었다.
...
10진수 9 --> 10 으로 값이 1이 증가하는 경우에
그레이코드는 1101 --> 1111 즉 [1]번 bit의 값만 바뀌었다.
[바이너리 코드--> 그레이 코드 변환]
10진수에서 그레이코드로 바로 변환할 수는 없다.
10진수 --> 바이너리 코드 --> 그레이 코드로 변환할 수 있다.
변환하는 방법 MSB는 그대로 사용하고, 그 다음부터는 인접한 bit끼리 XOR연산을 하면 된다.
EX) 1001(binary) --> 1101(gray)
[그레이 코드--> 바이너리 코드 변환]
마찬가지로 그레이코드를 바로 10진수로 변환할 수는 없다.
그레이 코드 --> 바이너리 코드 --> 10진수 로 변환할 수 있다.
변환하는 방법 MSB는 그대로 사용하고, 나온 결과값과 그 다음 bit를 XOR연산을 하면 된다.
EX) 1101(gray) --> 1001(binary)
[그레이 코드 사용 목적]
순차적으로 값이 증감하는 경우에 한 bit만 변경해 주면 되므로 속도가 빨라진다.
한 예로 watchdog timer의 counter 값이 gray code로 1씩 감소하게 되어있다.
'Programming > Algorithm' 카테고리의 다른 글
링크드리스트의 모든 것 linked list (0) | 2021.07.02 |
---|---|
머지소트(merge sort) (0) | 2021.06.16 |
배열이용하여 Hash 사용하기(feat. 코딩테스트) (0) | 2021.06.14 |
동적할당 대신 배열을 사용해 시간 줄이기(feat. 코딩테스트) (1) | 2021.06.14 |
호너의 법칙, 진법 변환 (feat. Honer's method) (0) | 2020.01.06 |