> 格雷碼 | 反射 | 二進位 <
// 格雷碼——相鄰數值之間僅有一個位元不同的二進位系統
單位距離
任兩個相鄰碼字之間僅有一個位元改變。
錯誤減少
在類比/數位轉換等場景中,有效減少毛刺與誤判。
循環特性
首碼與尾碼同樣只差一個位元,適合環狀計數。
>> 技術說明
格雷碼的運作原理:
格雷碼(Gray Code,又稱反射二進位碼)是一種編碼方式,使得每次狀態變化時只有一個位元翻轉。常見作法是將二進位數的每一位與前一位做 XOR,產生對應的格雷碼。由於同一時間只會有一位變化,可大幅降低位置編碼器與數位電路在切換瞬間的讀值錯誤。
格雷碼範例:
Decimal | Binary | Gray Code 0 | 0000 | 0000 1 | 0001 | 0001 2 | 0010 | 0011 3 | 0011 | 0010 4 | 0100 | 0110 5 | 0101 | 0111 6 | 0110 | 0101 7 | 0111 | 0100 說明:任兩個相鄰的格雷碼之間僅有 1 位不同
為什麼要使用格雷碼:
- ▸旋轉編碼器與位置感測器
- ▸卡諾圖(Karnaugh Map)化簡邏輯
- ▸數位通訊中的錯誤控制
- ▸健壯的狀態機與計數器設計
- ▸類比訊號取樣時減少毛刺與跳變
>> 常見問題
什麼是格雷碼?
格雷碼是一種相鄰狀態只改變一個位元的二進位編碼方式,又稱反射二進位碼。與一般二進位遞增相比,它能避免多位同時翻轉,減少切換瞬間所產生的錯誤讀值。
如何將二進位轉換為格雷碼?
轉換規則:1)最高有效位元(MSB)保持不變;2)從次高位開始,每一位等於目前二進位位元與前一位的 XOR。公式:G[i] = B[i] XOR B[i-1]。例如,二進位 1011 對應的格雷碼為 1110。
為什麼編碼器喜歡使用格雷碼?
在傳統二進位當中,像 0111 跳到 1000 會有多位元同時翻轉,若感測器不同步,很容易讀到不存在的中間值。格雷碼一次只翻轉一位,在旋轉編碼器、滑動電位器等應用中可以顯著降低歧義。
格雷碼常見的應用有哪些?
格雷碼廣泛用於旋轉編碼器、卡諾圖邏輯化簡、數位通訊調變與錯誤修正、遺傳演算法中的染色體編碼,以及各種希望避免「多位跳變」的計數器與取樣系統。
// 速查表
| Dec | Binary | Gray |
|---|---|---|
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | 100 |
// 程式碼範例
Binary -> Gray g = b ^ (b >> 1)
Gray -> Binary b = g; for (m = g >> 1; m; m >>= 1) b ^= m;
Python def to_gray(n): return n ^ (n >> 1)
def from_gray(g):
n = 0
while g: n ^= g; g >>= 1
return n
n bits 2^n codes, successive codes differ by exactly 1 bit (also 2^n - 1 -> 0)
>> 更多問題
問:什麼是格雷碼?
答:格雷碼(反射二進位碼)是相鄰兩個數值只相差一位的編碼。由貝爾實驗室的法蘭克·格雷申請專利,具有循環性:最後一個值與第一個值也只差一位。
問:為什麼旋轉編碼器使用格雷碼?
答:一般二進位在 011 到 100 這樣的跳變時多位同時變化,若感測器切換不完全同步,會短暫出現錯誤值。格雷碼每次只變一位,誤差最多一個位置。
問:如何把格雷碼轉換為二進位?
答:最高位保持不變,之後每個二進位位元等於前一個二進位位元互斥或目前格雷碼位元。公式:b = g ^ (g >> 1) ^ (g >> 2) ^ …。二進位轉格雷碼則是 g = b ^ (b >> 1)。