지구와 이웃 은하들 사이에서는 매 밀리초마다 수조의 수조 배에 달하는 메시지가 오가요. 하지만 이렇게 먼 거리로 전송하는 일은 까다로워요. 성가신 태양 플레어, 시간 왜곡, 떠도는 힘, 그리고 심지어 우주 나비의 날갯짓 한 번까지도 전송 중에 임의의 비트 하나를 바꿔버릴 수 있어요.
이제 그 결과를 상상해 봐요:
손상된 메시지를 탐지하는 건 그저 중요한 게 아니라 꼭 필요한 일이에요. 수신자는 재앙이 닥치기 전에 뭔가 잘못됐다는 걸 반드시 알아야 해요.
그런데 어떻게 해야 할까요? 우주 곳곳의 과학자와 엔지니어들은 아주 오랜 세월 동안 이 문제와 씨름해 왔어요. 온 우주의 AI 슈퍼클러스터가 데이터를 뒤지고 또 뒤졌죠. 그러던 어느 날, 하나의 전설이 다시 떠올라요. 디버깅 포럼에서 속삭여지고, 너무 많은 걸 봐버린 엔지니어들이 중얼거리던, 오래되고 강력한 방법이요...
패리티 비트!
너무나 단순하고 너무나 강력해서, 어쩌면 성간 통신을 구해낼지도 모르는 방법이에요.
해야 할 일은 다음 두 가지를 구현하는 걸 돕는 거예요.
패리티 비트는 전송 오류를 감지하는 간단한 방법이에요.
송신기와 수신기는 한 번에 정확히 8비트(패리티 비트 포함)만 주고받을 수 있어요.
패리티 비트는 각 전송에 1비트가 짝수 개가 되도록 설정하고, 항상 오른쪽에서 첫 번째 비트예요.
그래서 수신기가 11000001, 01110101, 01000000(즉, 1비트가 홀수 개인 전송)을 받으면 오류가 있다는 걸 알아요.
그런데 메시지가 이렇게 짧은 경우는 드물고, 더 길면 시퀀스 단위로 전송해야 해요.
예를 들어, 11000000 00000001 11000000 11011110(16진수로는 C0 01 C0 DE)이라는 메시지를 생각해 봐요.
각 전송에는 정확히 8비트가 들어가므로, 데이터 7비트와 패리티 비트만 담을 수 있어요. 따라서 데이터 7비트마다 그 뒤에 패리티 비트를 넣어야 해요.
11000000 00000001 11000000 11011110
↑ ↑ ↑ ↑ (7th bits)
이 메시지의 전송 시퀀스는 이렇게 생겼어요.
1100000_ 0000000_ 0111000_ 0001101_ 1110
↑ ↑ ↑ ↑ (parity bits)
시퀀스의 첫 번째 전송에 있는 데이터(1100000)에는 1비트가 두 개(짝수) 있어서 패리티 비트는 0이에요.
첫 번째 전송은 11000000(16진수로는 C0)이 돼요.
그다음 전송의 데이터(0000000)에는 1비트가 하나도 없어요(역시 짝수죠).
그래서 패리티 비트도 다시 0이에요.
따라서 두 번째 전송은 00000000(16진수로는 00)이 돼요.
다음 두 전송의 데이터(0111000과 0001101)에는 1비트가 세 개 있어요.
전송에 1비트가 짝수 개가 되도록 두 데이터의 패리티 비트는 1로 설정해요.
그래서 01110001과 00011011(16진수로는 71과 1B)로 전송돼요.
마지막 전송(1110)에는 데이터가 4비트뿐이에요.
한 번에 정확히 8비트를 전송해야 하고 패리티 비트가 맨 오른쪽 비트이므로, 0비트 세 개를 넣고 그 뒤에 패리티 비트를 붙여 8비트를 맞춰요.
이제 이렇게 돼요(_는 패리티 비트예요).
1110 000_
↑↑↑ (added 0 bits)
여기에도 1비트가 홀수 개 있어서 패리티 비트는 1이에요.
시퀀스의 마지막 전송은 11100001(16진수로는 E1)이 돼요.
이 메시지의 전체 전송 시퀀스는 11000000 00000000 01110001 00011011 11100001(16진수로는 C0 00 71 1B E1)이에요.
Exercism에 가입하고 Wren 트랙을 연습 문제 117개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.