格雷碼生成演算法分析及實現(C OC)

2021-06-19 21:24:53 字數 2448 閱讀 6443

gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任兩個數之間只有乙個位元值不同,例如以下為3位元的gray code:

000001 011 010 110 111 101 100

由定義可以知道,graycode的順序並不是唯一的,例如將上面的數列反過來寫,也是一組gray code:

100101 111 110 010 011 001 000

gray code是由貝爾實驗室的frank gray在2023年代提出的,用來在使用pcm(puslecode modulation)方法傳送訊號時避免出錯,並於2023年三月十七日取得美國專利。

格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式。因為,雖然自然二進位製碼可以直接由數/模轉換器轉換成模擬訊號,但在某些情況,例如從十進位制的3轉換為4時二進位製碼的每一位都要變,能使數位電路產生很大的尖峰電流脈衝。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減少了由乙個狀態到下乙個狀態時邏輯的混淆。由於這種編碼相鄰的兩個碼組之間只有一位不同,因而在用於風向的轉角位移量-數字量的轉換中,當風向的轉角位移量發生微小變化(而可能引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。例如,按自然數遞增計數,若採用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它**(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。

格雷碼是一種絕對編碼方式,典型格雷碼是一種具有反射特性和迴圈特性的單步自補碼,它的迴圈、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。

由於格雷碼是一種變權碼,每一位碼沒有固定的大小,很難直接進行比較大小和算術運算,也不能直接轉換成液位訊號,要經過一次碼變換,變成自然二進位製碼,再由上位機讀取。[3]

典型格雷碼是一種採用絕對編碼方式的準權碼,其權的絕對值為2^i-1(設最低位i=1)。

格雷碼的十進位制數奇偶性與其碼字中1的個數的奇偶性相同。

由於graycode相鄰兩數之間只改變乙個位元,所以可觀 察graycode從1變0或從0變1時的位置,假設有4位元的graycode如下:

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。

#define maxbit 20//字元陣列大小

#define true 1

#define change_bit(x) x = ((x) == '0' ? '1' : '0')//取反

#define next(x) x = (1 - (x))//改變奇偶

//主程式,不清楚的可參考注釋

char digit[maxbit];//宣告字元陣列

int i;//迴圈的時候用

int bits;//位元數,只是乙個數字

int odd;//是不是奇數(不斷在奇偶間變化)

int dnum = 0;//十進位制中對應的數字

printf("%d ",dnum);

dnum++;

bits = 4;//位元數,這裡以4為例

for(i = 0; i < bits; i++)

printf("\n");

odd = true;//是奇數,以上是為了輸出0所對應的格雷碼,特殊處理,順便初始化字元陣列

while(1)

printf("%d ",dnum);

dnum++;

for(i = bits - 1; i >= 0; i--)//反向列印

printf("%c", digit[i]);

printf("\n");

next(odd);//改變奇偶

}

格雷碼生成演算法詳解(c語言)

gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任 兩個數之間只有乙個位元值不同,例如以下為3位元的gray code 000 001 011 010 110 111 101 100由定義可以知道,gray code的順序並不是唯一的,例如將上面的數列反過來...

自動生成格雷碼演算法

典型的二進位制格雷碼 binary gray code 簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為 格雷碼 gray code 另外由於最大數與最小數之間也僅一位數不同,即 首尾相連 因此又稱 迴圈碼或 反射碼。自動生成格雷碼的演算法主要利用以下規則 1....

也談自動生成格雷碼演算法

工作10年了,總覺得自己是不是應該學點什麼。今天突發奇想,是不是可以用程式來自動生成格雷碼?其實只要看懂了這張圖,格雷碼的編譯碼都是小菜一碟。格雷碼的每乙個位其實都是對應二進位製碼的位跟其較高位的異或。簡單說就是g0 b1 b0 拿起gcc就開始寫,編碼函式就這麼完成了。int grayencode...