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

2021-06-23 02:00:04 字數 1670 閱讀 1648

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

000 001 011 010 110 111 101 100由定義可以知道,gray code的順序並不是唯一的,例如將上面的數列反過來寫,也是一組gray

code:

100 101 111 110 010 011 001 000

gray code是由貝爾實驗室的frank gray在2023年代提出的,用來在使用pcm(pusle codemodulation)方法傳送訊號時避免出錯,並於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開始,格雷碼產生的規律是:第一步,改變最右邊的位元值;第二步,改變右起第乙個為1的位元的左邊位元;第三步,第四步重複第一步和第二步,直到所有的格雷碼產生完畢(換句話說,已經走了(2^n) - 1 步)。

用乙個例子來說明:

假設產生3位元的格雷碼,原始值位 000

第一步:改變最右邊的位元值: 00 1

第二步:改變右起第乙個為1的位元的左邊位元: 011

第三步:改變最右邊的位元值: 010

第四步:改變右起第乙個為1的位元的左邊位元: 110

第五步:改變最右邊的位元值: 111

第六步:改變右起第乙個為1的位元的左邊位元: 101

第七步:改變最右邊的位元值: 100

如果按照這個規則來生成格雷碼,是沒有問題的,但是這樣做太複雜了

所以只要判斷位元的位置是奇數還是偶數,就

可以決定要改變哪乙個位元的值,通過乙個標識flag進行判斷位置

#include "stdafx.h"

#include

//#define method1

#define method2

#define maxbits 20

#define chanbit(x) x=(x=='0')?'1':'0'

int main()

//輸出格雷碼的第乙個元素 也就是全零

for(int i=0;i

printf("\n");

//輸出格雷碼其它元素

int flag=1;//用來進行演算法的變化的關鍵標識,也就是:第一步,改變最右邊的位元值;第二步,改變右起第乙個為1的位元的左邊位元

while (1)

else

chanbit(bina_bits[i-1]);

}for (int i=0;i

printf("\n");

flag=abs(flag-1);}}

return 0;}

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

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

生成格雷碼C

題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 返回的格雷碼個數一共為2 n,2的n次方 例如 n 1,返回 ...

自動生成格雷碼演算法

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