每毫秒都有數以兆計的訊息在地球與鄰近星系之間飛速穿梭。 但要在這麼遙遠的距離上傳輸訊息,可不是件容易的事。 惱人的太陽閃焰、時空扭曲、游離的作用力,甚至太空蝴蝶輕拍一下翅膀,都可能在傳輸過程中讓某個位元隨機改變。
現在想像一下後果:
偵測損毀的訊息不只是重要,而是攸關存亡。 接收端_必須_在災難發生之前知道出了問題。
但該怎麼做呢? 來自宇宙各地的科學家和工程師已經與這個問題搏鬥了億萬年。 龐大的宇宙級 AI 超級叢集不停消化這些資料。 直到某一天,一個傳說重現了:一個古老卻強大的方法,在除錯論壇上被人悄悄提起,被見識過太多事情的工程師低聲傳頌……
同位位元!
這個方法如此簡單、如此強大,或許正好能拯救星際通訊。
你的任務是協助實作
同位位元是偵測傳輸錯誤的簡單做法。
發送器和接收器一次只能傳輸和接收_正好_ 8 個位元(包含同位位元)。
同位位元的設定方式,是讓每次傳輸中的 1 位元數量為_偶數_,而且同位位元永遠是從右邊數來的第一個位元。
所以如果接收器收到 11000001、01110101 或 01000000(也就是含有奇數個 1 位元的傳輸),就知道發生了錯誤。
不過,訊息很少這麼短;當訊息較長時,就必須拆成序列來傳輸。
舉例來說,假設訊息是 11000000 00000001 11000000 11011110(或十六進位的 C0 01 C0 DE)。
由於每次傳輸正好包含 8 個位元,其中只能放入 7 個位元的資料以及同位位元。 因此,每 7 個位元的資料後面都必須插入一個同位位元:
11000000 00000001 11000000 11011110
↑ ↑ ↑ ↑ (7th bits)
這個訊息的傳輸序列如下:
1100000_ 0000000_ 0111000_ 0001101_ 1110
↑ ↑ ↑ ↑ (parity bits)
序列中第一個傳輸的資料(1100000)有 2 個 1 位元(偶數),所以同位位元是 0。
第一個傳輸就變成 11000000(或十六進位的 C0)。
下一個傳輸的資料(0000000)有 0 個 1 位元(又是偶數),所以同位位元同樣是 0。
第二個傳輸因此變成 00000000(或十六進位的 00)。
接下來兩個傳輸的資料(0111000 和 0001101)有 3 個 1 位元。
它們的同位位元設為 1,讓整個傳輸含有偶數個 1 位元。
它們會以 01110001 和 00011011 傳輸(或十六進位的 71 和 1B)。
最後一個傳輸(1110)只有 4 個位元的資料。
由於一次正好傳輸 8 個位元,而同位位元是最右邊的位元,因此會補上 3 個 0 位元,再加上同位位元,湊成 8 個位元。
現在看起來像這樣(其中_代表同位位元):
1110 000_
↑↑↑ (added 0 bits)
這裡的 1 位元數量又是奇數,所以同位位元是 1。
序列中最後一個傳輸變成 11100001(或十六進位的 E1)。
這個訊息完整的傳輸序列是 11000000 00000000 01110001 00011011 11100001(或十六進位的 C0 00 71 1B E1)。