gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任兩個數之間只有乙個位元值不同,例如以下為3位元的gray code:
000
001011
010110
111101
100
由定義可以知道,gray code的順序並不是唯一的,例如將上面的數列反過來寫,也是一組gray code:
100
101111
110010
011001
000
gray code是由貝爾實驗室的frank gray在2023年代提出的,用來在使用pcm(pusle code modulation)方法傳送訊號時避免出錯,並於2023年三月十七日取得美國專利。
由於gray code相鄰兩數之間只改變乙個位元,所以可觀 察gray code從1變0或從0變1時的位置,假設有4位元的gray code如下:
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
觀察奇數項的變化時,我們發現無論它是第幾個gray code,永遠只改變最右邊的位元,如果是1就改為0,如果是0就改為1。
觀察偶數項的變化時,我們發現所改變的位元,是由右邊算來第乙個1的左邊位元。
以上兩個變化規則是固定的,無論位元數為何;所以只要判斷位元的位置是奇數還是偶數,就可以決定要改變哪乙個位元的值,為了程式撰寫方便,將陣列索引 0當作最右邊的值,而在列印結果時,是由索引數字大的開始反向列印。
將2位元的gray code當作平面座標來看,可以構成乙個四邊形,您可以發現從任一頂點出發, 繞四邊形周長繞一圈,所經過的頂點座標就是一組gray code,所以您可以得到四組gray code。
同樣的將3位元的gray code當作平面座標來看的話,可以構成乙個正立方體,如果您可以從任一頂點出發,將所有的邊長走過,並不重複經過頂點的話,所經過的頂點座標順序之組合也就是一組gray code。
#include
#include
#define maxbit 20
#define true 1
#define change_bit(x) x = ((x) == '0' ? '1' : '0')
#define next(x) x = (1 - (x))
intmain
(void
)printf
("\n"
); odd = true;
while(1
)for
(i = bits -
1; i >=
0; i--
)printf
("%c"
, digit[i]);
printf
("\n");
next
(odd);}
return0;
}
生成格雷碼C
題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 返回的格雷碼個數一共為2 n,2的n次方 例如 n 1,返回 ...
演算法實驗 格雷碼問題
實驗 遞迴演算法設計與應用 一.基本原理的概括 遞迴是一種重要的程式設計方法。使用遞迴方法有時可使演算法簡潔明瞭,邏輯清晰,易於設計。遞迴指演算法自己呼叫自己,有直接遞迴與間接遞迴兩種。遞迴方法用於解決一類滿足遞迴關係的問題。即 對原問題的求解可轉化為對其性質相同的子問題的求解。二.該類演算法設計與...
自動生成格雷碼演算法
典型的二進位制格雷碼 binary gray code 簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為 格雷碼 gray code 另外由於最大數與最小數之間也僅一位數不同,即 首尾相連 因此又稱 迴圈碼或 反射碼。自動生成格雷碼的演算法主要利用以下規則 1....