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....