格雷碼是什麼?
反射二進位制碼或格雷碼是對二進位制數系統的一種排序,使得兩個連續的值僅在一個位元(二進位制數字)上不同。格雷碼在硬體生成的二進位制數的正常序列中非常有用,因為從一個數字到下一個數字的轉換可能會導致錯誤或歧義。因此,格雷碼可以輕鬆地消除此問題,因為在兩個數字之間的任何轉換期間,只有一個位元改變其值。
格雷碼不是加權的,這意味著它不依賴於數字的位置值。這是一種迴圈變數碼,這意味著從一個值到下一個值的每次轉換都只涉及一個位元的變化。
格雷碼也稱為反射二進位制碼,因為前 (n/2) 個值與後 (n/2) 個值相同,但順序相反。
構造一個 n 位格雷碼
n 位格雷碼可以使用反射和字首方法遞迴生成,如下所述。
- 生成 n=1 的程式碼:0 和 1 程式碼。
- 按順序取之前的程式碼:0 和 1。
- 在以下列表中新增反轉的程式碼:0、1、1 和 0。
- 現在為原始的先前程式碼新增字首 0,為新生成的程式碼新增字首 1:00、01、11 和 10。
因此,格雷碼 0 和 1 分別對應於二進位制數 0 和 1。格雷碼:00、01、11 和 10 分別對應於二進位制數:00、01、10 和 11。類似地,您可以為 3 位二進位制數構造格雷碼
因此,格雷碼如下所示:
對於 n = 1 位 | 對於 n = 2 位 | 對於 n = 3 位 | |||
---|---|---|---|---|---|
二進位制 | 格雷碼 | 二進位制 | 格雷碼 | 二進位制 | 格雷碼 |
0 | 0 | 00 | 00 | 000 | 000 |
1 | 1 | 01 | 01 | 001 | 001 |
| 10 | 11 | 010 | 011 | |
11 | 10 | 011 | 010 | ||
| 100 | 110 | |||
101 | 111 | ||||
110 | 101 | ||||
111 | 100 |
從 Gn 生成 G(n+1) 的迭代方法如下所示。這是一種更簡單的構造 n 位二進位制數的格雷碼的方法。如果輸入值的下一個較高位設定為 1,則每個位都被反轉。第 n 個格雷碼是透過計算 n⊕(floor(n/2)) 獲得的。
- Gn 是從 0 到 (2n-1) 的排列的唯一數字。
- Gn 嵌入到 G(n+1) 的前半部分,後半部分為 G(n+1) 的反序。
- 在前一半的每個數字中新增字首 0,在後一半的每個數字中新增字首 1。
兩個相鄰格雷碼的漢明距離始終為 1,並且第一個格雷碼和最後一個格雷碼的漢明距離也始終為 1,因此它也稱為 迴圈碼。
您可以使用其他方法構造格雷碼,但它們可能無法像上面給出的方法那樣並行執行。例如,可以使用 K 對映構造 3 位格雷碼,如下所示
十進位制 | 二進位制 | 格雷碼 |
---|---|---|
0 | 000 | 000 |
1 | 001 | 001 |
2 | 010 | 011 |
3 | 011 | 010 |
4 | 100 | 110 |
5 | 101 | 111 |
6 | 110 | 101 |
7 | 111 | 100 |
格雷碼的型別
還有其他型別的格雷碼,例如貝克特-格雷碼、單軌格雷碼等。
- N 進位制格雷碼,其中包含非布林值,例如 1、2、3 的序列。
- 二維 (n,k) 格雷碼用於糾錯。
- 平衡格雷碼具有相等的轉換計數。
格雷碼的用途
格雷碼用於旋轉和光學編碼器、卡諾圖和錯誤檢測。
廣告