A. C語言 遞歸 輸出格雷碼(Gray碼)
你查網路:
一般的,普通二進制碼與格雷碼可以按以下方法互相轉換:
二進制碼->格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應格雷碼該位的值,最左邊一位不變(相當於左邊是0);
格雷碼-〉二進制碼(解碼):從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變)
如果非要按遞歸來做,可以這樣,如果要輸出n位格雷碼,那麼遞歸層為N:0層負責第0位,1層負責第1位,2層負責第2位。。。。第n-1層負責第n-1位(也就是gray的最高位)這樣就可以寫出遞歸函數的輪廓了。
void gray(int n)
{
if(0==n)
{……;return;}
……
gray(n-1);//把處理第n-1位的任務交下一層處理
}
對於第0位來說,每4位為一個循環周期——01 10.
對於第1位來說,每8位為一個循環周期——0011 1100.
對於第2位來說,每16位為一個循環周期——00001111 11110000.
……
對於第N位來說,每2^(N+2)為一個循環周期。
看到這里你有什麼啟發?
所以我想你應該設置一個全局變數:int flag=1.
對於gray(i)函數來說,可以通過set=flag%(2^(i+2))來設置該第位(當2^i<set&&set<=3*2^i,就設第i位為1)
B. 格雷碼有什麼特點,用於什麼場合,與二進制碼之間如何進行轉換
格雷碼有什麼特點?
--相鄰兩數的格雷碼,僅有一位二進制碼不同。
用於什麼場合?
--自動控制、通訊、等,穩定性要求較高的場合。
與二進制碼之間如何進行轉換?
--使用「數字邏輯電路」,轉換最快了。
C. 格雷碼的轉換方法
這種方法基於格雷碼是反射碼的事實,利用遞歸的如下規則來構造: 1位格雷碼有兩個碼字 (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加前綴0 (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加前綴1 n+1位格雷碼的集合 = n位格雷碼集合(順序)加前綴0 + n位格雷碼集合(逆序)加前綴1 2位格雷碼3位格雷碼4位格雷碼4位自然二進制碼00
01
11
10 000
001
011
010
110
111
101
100 0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000 0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111 二進制碼→格雷碼(編碼):
此方法從對應的n位二進制碼字中直接得到n位格雷碼碼字,步驟如下: 對n位二進制的碼字,從右到左,以0到n-1編號 如果二進制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變) 公式表示:(G:格雷碼,B:二進制碼) 例如:二進制碼0101,為4位數,所以其所轉為之格雷碼也必為4位數,因此可取轉成之二進位碼第五位為0,即0 b3 b2 b1 b0。
0 xor 0=0,所以g3=0
0 xor 1=1,所以g2=1
1 xor 0=1,所以g1=1
0 xor 1=1,所以g0=1
因此所轉換為之格雷碼為0111 格雷碼→二進制碼(解碼):
從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變)。依次異或,直到最低位。依次異或轉換後的值(二進制數)就是格雷碼轉換後二進制碼的值。
公式表示:(G:格雷碼,B:二進制碼)
原碼:p[n:0];格雷碼:c[n:0](n∈N);編碼:c=G(p);解碼:p=F(c);
書寫時按從左向右標號依次減小,即MSB->LSB,編解碼也按此順序進行 舉例:
如果採集器器採到了格雷碼:1010
就要將它變為自然二進制:
0 與第四位 1 進行異或結果為 1
上面結果1與第三位0異或結果為 1
上面結果1與第二位1異或結果為 0
上面結果0與第一位0異或結果為 0
因此最終結果為:1100 這就是二進制碼即十進制 12
當然人看時只需對照表1一下子就知道是12 ...................c[n]=p[n],
解碼: 利用卡諾圖相鄰兩格只有一位變化以及卡諾圖的變數取值以低階格雷碼的順序排布的特徵,可以遞歸得到高階格雷碼。由於此方法相對繁瑣,使用較少。生成格雷碼的步驟如下: 將卡諾圖變數分為兩組,變數數目相近(最好相等) 以邏輯變數高位在左低位在右建立卡諾圖 從卡諾圖的左上角以之字形到右上角最後到左下角遍歷卡諾圖,依次經過格子的變數取值即為典型格雷碼的順序 三位格雷碼(三位格雷碼由建立在二位基礎上) AB╲ C 0 1 00 0→ 1↓ 01 ↓2 ←3 11 6→ 7↓ 10 4 ←5 格雷碼次序:000起點→001→011→010→110→111→101→100終點
四位格雷碼 AB╲CD 00 01 11 10 00 0→ 1→ 3→ 2↓ 01 ↓4 ←5 ←7 ←6 11 12→ 13→ 15→ 14↓ 10 8 ←9 ←11 ←10 格雷碼次序:0000起點→0001→0011→0010→0110→0111→0101→0100→1100→1101→
1111→1110→1010→1011→1001→1000終點 用異或代替加減進行二進制豎式乘除,稱為異或乘除,它的特點是無進退位。
如:10101除以11將變成1100餘1。
二進制轉格雷碼:
只要異或乘以二分之三,即二進制的1.1,然後忽略小數部分;也可以理解成異或乘以三(即11),再右移一位。
格雷碼轉二進制:
異或除以三分之二,即除以1.1,忽略余數;或者左移一位,再異或除以三,忽略余數。
D. 格雷碼如何轉換成二進制
最左邊一位依然不變依次異或,直到最低位。依次異或轉換後的值就是格雷碼轉換後的二進制值。
在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼為格雷碼(Gray Code),另外由於最大數與最小數之間也僅一位數不同,即「首尾相連」,因此又稱循環碼或反射碼。
典型的二進制格雷碼(Binary Gray Code)簡稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利「Pulse Code Communication」而得名,當初是為了通信,現在則常用於模擬-數字轉換和位置-數字轉換中。
法國電訊工程師波特(Jean-Maurice-Émile Baudot,18450911-19030328)在1880年曾用過的波特碼相當於它的一種變形。1941年George Stibitz設計的一種8元二進制機械計數器正好符合格雷碼計數器的計數規律。
二進制(binary),發現者萊布尼茨,是在數學和數字電路中以2為基數的記數系統,是以2為基數代表系統的二進位制。這一系統中,通常用兩個不同的符號0(代表零)和1(代表一)來表示。
數字電子電路中,邏輯門的實現直接應用了二進制,現代的計算機和依賴計算機的設備里都使用二進制。每個數字稱為一個比特(Bit,Binary digit的縮寫)。
E. 格雷碼10110轉換為二進制是多少
與上圖對應:格雷碼10110轉換為二進制為11011。