이진수는 밑이 2인 수이고, 각 자리(비트)의 자릿값은 2의 거듭제곱이다. 예를 들어 십진수 23은 이진수로 10111인데, 다음이 성립하기 때문이다.
(1×24)+(0×23)+(1×22)+(1×21)+(1×20)=16+4+2+1=23
그레이 코드 수열은 이진값을 나열한 것으로, 각 값이 바로 앞 값과 정확히 한 비트만 다르다. 아래 표는 3비트 이진수의 표준 그레이 코드 수열이다.
| 이진수 수열 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
| 표준 그레이 코드 수열 | 000 | 001 | 011 | 010 | 110 | 111 | 101 | 100 |
이진수를 대응하는 표준 그레이 코드 값으로 바꾸는 방법은 아주 간단하다. 이진값 011을 바꾼다고 하자. 먼저 첫 비트를 그대로 옮겨 적는다.
0 1 1
v
0
둘째 비트는 주어진 이진수의 첫째 비트와 둘째 비트를 더해서 얻는다. 합은 0+1=1이다.
0 + 1 1
v
0 1
셋째 비트는 주어진 이진수의 둘째 비트와 셋째 비트를 더해서 얻는다. 합은 이진수로 1+1=10이지만 올림은 버리므로 오른쪽 끝 비트인 0만 취한다.
0 1 + 1
v
0 1 0
따라서 답은 010이다.
일반적으로 첫 비트를 빼면, 표준 그레이 코드의 k번째 비트는 주어진 이진수의 k−1번째 비트와 k번째 비트를 더한 뒤 올림을 버려서 얻는다. 올림을 버리는 덧셈은 다음 네 가지가 전부다.
0 0 1 1
+ 0 + 1 + 0 + 1
--- --- --- ---
0 1 1 0
n비트 이진값을 대응하는 n비트 표준 그레이 코드 값으로 바꾸는 프로그램을 작성하시오. 1≤n≤20이다.
입력은 두 줄이다.
주어진 n비트 이진수에 대응하는 표준 그레이 코드를 길이 n인 비트 문자열로 출력한다.