簡(jiǎn)介
在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱這種編碼為格雷碼(Gray Code),另外由于最大數(shù)與最小數(shù)之間也僅一位數(shù)不同,即“首尾相連”,因此又稱循環(huán)碼或反射碼。在數(shù)字系統(tǒng)中,常要求代碼按一定順序變化。例如,按自然數(shù)遞增計(jì)數(shù),若采用8421碼,則數(shù)0111變到1000時(shí)四位均要變化,而在實(shí)際電路中,4位的變化不可能絕對(duì)同時(shí)發(fā)生,則計(jì)數(shù)中可能出現(xiàn)短暫的其它代碼(1100、1111等)。在特定情況下可能導(dǎo)致電路狀態(tài)錯(cuò)誤或輸入錯(cuò)誤。使用格雷碼可以避免這種錯(cuò)誤。格雷碼有多種編碼形式。
格雷碼(Gray Code)曾用過(guò)Grey Code、葛萊碼、格萊碼、戈萊碼、循環(huán)碼、反射二進(jìn)制碼、最小差錯(cuò)碼等名字,它們有的不對(duì),有的易與其它名稱混淆,建議不要再使用這些曾用名。
格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,其循環(huán)和單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大錯(cuò)誤的可能,其反射和自補(bǔ)特性使得對(duì)其進(jìn)行求反操作也非常方便,所以,格雷碼屬于一種可靠性編碼,是一種錯(cuò)誤最小化的編碼方式,因此格雷碼在通信和測(cè)量技術(shù)中得到廣泛應(yīng)用。生成格雷碼
000
001
011
010
110
111
101
100
算法實(shí)現(xiàn)
1、遞歸實(shí)現(xiàn)
/** * 遞歸生成二進(jìn)制格雷碼 * 思路:1、獲得n-1位生成格雷碼的數(shù)組 * 2、由于n位生成的格雷碼位數(shù)是n-1的兩倍,故只要在n為格雷碼的前半部分加0,后半部分加1即可。 * @param n 格雷碼的位數(shù) * @return 生成的格雷碼數(shù)組 */ public static String[] GrayCode(int n) { //數(shù)組的大小是2的n次方,因?yàn)閚位的格雷碼有2的n次方種排列 String[] grayCodeArr = new String[(int)Math.pow(2, n)]; if(n < 1) { System.out.); } if(1 == n) { grayCodeArr[0] = "0"; grayCodeArr[1] = "1"; return grayCodeArr; } //n-1 位格雷碼的生成方式 String[] before = GrayCode(n-1); for(int i = 0 ; i < before.length ; i++){ grayCodeArr[i] = "0" + before[i]; grayCodeArr[grayCodeArr.length -1 - i] = "1" + before[i]; } return grayCodeArr; }
2、非遞歸實(shí)現(xiàn)
/** * 非遞歸生成二進(jìn)制格雷碼 * 思路:1、獲得n-1位生成格雷碼的數(shù)組 * 2、由于n位生成的格雷碼位數(shù)是n-1的兩倍,故只要在n為格雷碼的前半部分加0,后半部分加1即可。 * @param n 格雷碼的位數(shù) * @return 生成的格雷碼數(shù)組 */ public static String[] GrayCode2(int n) { int num = (int)Math.pow(2, n);//根據(jù)輸入的整數(shù),計(jì)算出此Gray序列大小 String[] s1 = {"0","1"};//第一個(gè)Gray序列 if(n < 1) { System.out.println("你輸入的格雷碼位數(shù)有誤!"); } for(int i=2;i<=n;i++){//循環(huán)根據(jù)第一個(gè)Gray序列,來(lái)一個(gè)一個(gè)的求 int p = (int)Math.pow(2, i);//到了第幾個(gè)的時(shí)候,來(lái)計(jì)算出此Gray序列大小 String[] si = new String[p]; for(int j=0;j<p;j++){//循環(huán)根據(jù)某個(gè)Gray序列,來(lái)一個(gè)一個(gè)的求此序列 if(j<(p/2)){ si[j] = "0" + s1[j];//原始序列前面加上"0" }else{ si[j] = "1" + s1[p-j-1];//原始序列反序,前面加上"1" } } s1 = si;//把求得的si,附給s1,以便求下一個(gè)Gray序列 } return s1; }
3、測(cè)試
public static void main(String[] args) { System.out.println("————————————————————遞歸實(shí)現(xiàn)————————————————"); String[] strArr = GrayCode(4); for(int i = 0 ; i < strArr.length ; i++) { System.out.println(strArr[i]); } System.out.println("——————————————————非遞歸實(shí)現(xiàn)————————————————"); String[] strArr2 = GrayCode2(4); for(int i = 0 ; i < strArr2.length ; i++) { System.out.println(strArr2[i]); } }
4、結(jié)果:
————————————————————遞歸實(shí)現(xiàn)————————————————0000000100110010011001110101010011001101111111101010101110011000——————————————————非遞歸實(shí)現(xiàn)————————————————0000000100110010011001110101010011001101111111101010101110011000
致謝:感謝您的耐心閱讀!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注