日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

gray code java_格雷码Gray Code详解

發(fā)布時(shí)間:2024/1/1 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gray code java_格雷码Gray Code详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

格雷碼簡(jiǎn)介

在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱(chēng)這種編碼為格雷碼(Gray Code),另外由于最大數(shù)與最小數(shù)之間也僅一位數(shù)不同,即“首尾相連”,因此又稱(chēng)循環(huán)碼或反射碼。格雷碼(Gray Code)又稱(chēng)Grey Code、葛萊碼、格萊碼、戈萊碼、循環(huán)碼、反射二進(jìn)制碼、最小差錯(cuò)碼等。

格雷碼有多種編碼形式

十進(jìn)制數(shù)

4位自然二進(jìn)制碼

4位典型格雷碼

十進(jìn)制余三格雷碼

十進(jìn)制空六格雷碼

十進(jìn)制跳六格雷碼

步進(jìn)碼

0

0000

0000

0010

0000

0000

00000

1

0001

0001

0110

0001

0001

00001

2

0010

0011

0111

0011

0011

00011

...

表中典型格雷碼具有代表性。若不作特別說(shuō)明,格雷碼就是指典型格雷碼,它可從自然二進(jìn)制碼轉(zhuǎn)換而來(lái)。

為什么要使用格雷碼?

格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,其循環(huán)和單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大錯(cuò)誤的可能,其反射和自補(bǔ)特性使得對(duì)其進(jìn)行求反操作也非常方便,所以,格雷碼屬于一種可靠性編碼,是一種錯(cuò)誤最小化的編碼方式,因此格雷碼在通信和測(cè)量技術(shù)中得到廣泛應(yīng)用。

格雷碼屬于可靠性編碼,是一種錯(cuò)誤最小化的編碼方式。因?yàn)?#xff0c;雖然自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),但在某些情況,例如從十進(jìn)制的3轉(zhuǎn)換為4時(shí)二進(jìn)制碼的每一位都要變,能使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒(méi)有這一缺點(diǎn),它在相鄰位間轉(zhuǎn)換時(shí),只有一位產(chǎn)生變化。它大大地減少了由一個(gè)狀態(tài)到下一個(gè)狀態(tài)時(shí)邏輯的混淆。由于這種編碼相鄰的兩個(gè)碼組之間只有一位不同,因而在用于方向的轉(zhuǎn)角位移量-數(shù)字量的轉(zhuǎn)換中,當(dāng)方向的轉(zhuǎn)角位移量發(fā)生微小變化(而可能引起數(shù)字量發(fā)生變化時(shí),格雷碼僅改變一位,這樣與其它編碼同時(shí)改變兩位或多位的情況相比更為可靠,即可減少出錯(cuò)的可能性。

在數(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ò)誤。

格雷碼是一種絕對(duì)編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,它的循環(huán)、單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大誤差的可能,它的反射、自補(bǔ)特性使得求反非常方便。

由于格雷碼是一種變權(quán)碼,每一位碼沒(méi)有固定的大小,很難直接進(jìn)行比較大小和算術(shù)運(yùn)算,也不能直接轉(zhuǎn)換成液位信號(hào),要經(jīng)過(guò)一次碼變換,變成自然二進(jìn)制碼,再由上位機(jī)讀取。

典型格雷碼是一種采用絕對(duì)編碼方式的準(zhǔn)權(quán)碼,其權(quán)的絕對(duì)值為2^i-1(設(shè)最低位i=1)。

格雷碼的十進(jìn)制數(shù)奇偶性與其碼字中1的個(gè)數(shù)的奇偶性相同。

應(yīng)用

格雷氏編碼與相位移在三維曲面量測(cè):利用格雷碼投射在微型曲面做量測(cè) 一個(gè)非接觸式、投影的方法光學(xué)測(cè)量。

在化簡(jiǎn)邏輯函數(shù)時(shí),可以通過(guò)按格雷碼排列的卡諾圖來(lái)完成。

角度傳感器:汽車(chē)制動(dòng)系統(tǒng)有時(shí)需要傳感器產(chǎn)生的數(shù)字值來(lái)指示機(jī)械位置。如圖是編碼盤(pán)和一些觸點(diǎn)的概念圖,根據(jù)盤(pán)轉(zhuǎn)的位置,觸點(diǎn)產(chǎn)生一個(gè)3位二進(jìn)制編碼,共有8個(gè)這樣的編碼。盤(pán)中暗的區(qū)域與對(duì)應(yīng)的邏輯1的信號(hào)源相連;亮的區(qū)域沒(méi)有連接,觸點(diǎn)將其解釋為邏輯0。使用格雷碼對(duì)編碼盤(pán)上的亮暗區(qū)域編碼,使得其連續(xù)的碼字之間只有一個(gè)數(shù)位變化。這樣就不會(huì)因?yàn)槠骷圃斓木_度有限,而使得觸點(diǎn)轉(zhuǎn)到邊界位置而出現(xiàn)錯(cuò)誤編碼。

九連環(huán)問(wèn)題:中國(guó)的古老益智玩具九連環(huán)有著和格雷碼完全相同的數(shù)學(xué)模式,外國(guó)一款名為spin out的玩具也是運(yùn)用相同的數(shù)學(xué)模式。智力玩具九連環(huán)的狀態(tài) 變化符合格雷碼的編碼規(guī)律,漢諾塔的解法也與格雷碼有關(guān)。九連環(huán)中的每個(gè)環(huán)都有上下兩種狀態(tài),如果把這兩種狀態(tài)用0/1來(lái)表示的話,這個(gè)狀態(tài)序列就會(huì)形成一種循環(huán)二進(jìn)制編碼(格雷碼)的序列。所以解決九連環(huán)問(wèn)題所需要的狀態(tài)變化數(shù)就是格雷碼111111111所對(duì)應(yīng)的十進(jìn)制數(shù)341。

二進(jìn)制格雷碼的生成

問(wèn)題:產(chǎn)生n位元的所有格雷碼字符串表示。

格雷碼(Gray Code)是一個(gè)數(shù)列集合,每個(gè)數(shù)使用二進(jìn)位來(lái)表示,假設(shè)使用n位元來(lái)表示每個(gè)數(shù)字,任兩個(gè)數(shù)之間只有一個(gè)位元值不同。

例如以下為3位元的格雷碼:?000 001 011 010 110 111 101 100 。

如果要產(chǎn)生n位元的格雷碼,那么格雷碼的個(gè)數(shù)為2^n。

直接排列

生成二進(jìn)制格雷碼方式1:以二進(jìn)制為0值的格雷碼為第零項(xiàng),第一項(xiàng)改變最右邊的位元,第二項(xiàng)改變右起第一個(gè)為1的位元的左邊位元,第三、四項(xiàng)方法同第一、二項(xiàng),如此反復(fù),即可排列出n個(gè)位元的格雷碼。

假設(shè)原始的值從0開(kāi)始,格雷碼產(chǎn)生的規(guī)律是:

第一步,改變最右邊的位元值;

第二步,改變右起第一個(gè)為1的位元的左邊位元;

第三步,第四步重復(fù)第一步和第二步,直到所有的格雷碼產(chǎn)生完畢(換句話說(shuō),已經(jīng)走了(2^n) - 1 步)。

用一個(gè)例子來(lái)說(shuō)明:

假設(shè)產(chǎn)生3位元的格雷碼,原始值位 000

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

第二步:改變右起第一個(gè)為1的位元的左邊位元: 011

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

第四步:改變右起第一個(gè)為1的位元的左邊位元: 110

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

第六步:改變右起第一個(gè)為1的位元的左邊位元: 101

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

鏡射排列

生成二進(jìn)制格雷碼方式2:n位元的格雷碼可以從n-1位元的格雷碼以上下鏡射后加上新位元的方式快速的得到,如圖所示。

??

如果按照直接排列規(guī)則來(lái)生成格雷碼,是沒(méi)有問(wèn)題的,但是這樣做太復(fù)雜了。如果仔細(xì)觀察格雷碼的結(jié)構(gòu),我們會(huì)有以下發(fā)現(xiàn):

1、除了最高位(左邊第一位),格雷碼的位元完全上下對(duì)稱(chēng)(看下面列表)。比如第一個(gè)格雷碼與最后一個(gè)格雷碼對(duì)稱(chēng)(除了第一位),第二個(gè)格雷碼與倒數(shù)第二個(gè)對(duì)稱(chēng),以此類(lèi)推。

2、最小的重復(fù)單元是 0 , 1。

000

001

011

010

110

111

101

100

所以,在實(shí)現(xiàn)的時(shí)候,我們完全可以利用遞歸,在每一層前面加上0或者1,然后就可以列出所有的格雷碼。

比如:

第一步:產(chǎn)生 0, 1 兩個(gè)字符串。

第二步:在第一步的基礎(chǔ)上,正向每一個(gè)字符串都分別加上0,然后反向迭代每一個(gè)字符串都加上1,但是每次只能加一個(gè),所以得做兩次。這樣就變成了 00,01,11,10 (注意對(duì)稱(chēng))。

第三步:在第二步的基礎(chǔ)上,再給每個(gè)字符串都加上0和1,同樣,每次只能加一個(gè),這樣就變成了 000,001,011,010,110,111,101,100。這樣就把3位元格雷碼生成好了。

如果要生成4位元格雷碼,我們只需要在3位元格雷碼上再加一層0,1就可以了:?0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.

也就是說(shuō),n位元格雷碼是基于n-1位元格雷碼產(chǎn)生的。

[格雷碼維基百科]

其它方法

利用卡諾圖生成

利用卡諾圖相鄰兩格只有一位變化以及卡諾圖的變量取值以低階格雷碼的順序排布的特征,可以遞歸得到高階格雷碼。由于此方法相對(duì)繁瑣,使用較少。生成格雷碼的步驟如下:

將卡諾圖變量分為兩組,變量數(shù)目相近(最好相等)

以邏輯變量高位在左低位在右建立卡諾圖

從卡諾圖的左上角以之字形到右上角最后到左下角遍歷卡諾圖,依次經(jīng)過(guò)格子的變量取值即為典型格雷碼的順序

利用二進(jìn)制碼轉(zhuǎn)換

轉(zhuǎn)換方法參考下面吧。

格雷碼和二進(jìn)制碼的轉(zhuǎn)換

自然二進(jìn)制碼與格雷碼的對(duì)照表:

十進(jìn)制數(shù)

自然二進(jìn)制數(shù)

格雷碼

十進(jìn)制數(shù)

自然二進(jìn)制數(shù)

格雷碼

0

0000

0000

8

1000

1100

1

0001

0001

9

1001

1101

2

0010

0011

10

1010

1111

3

0011

0010

11

1011

1110

4

0100

0110

12

1100

1010

5

0101

0111

13

1101

1011

6

0110

0101

14

1110

1001

7

0111

0100

15

1111

1000

二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼

二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼,其法則是保留二進(jìn)制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進(jìn)制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類(lèi)似。

二進(jìn)制碼 ----> 格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對(duì)應(yīng)格雷碼該位的值,最左邊一位不變(相當(dāng)于左邊是0)。

Note: 這樣做可行的原因,是因?yàn)槎M(jìn)制碼每次+1時(shí)最多只有一個(gè)相鄰的兩個(gè)bit對(duì)的異或值會(huì)發(fā)生改變。

公式表示:G:格雷碼 B:二進(jìn)制碼

整個(gè)數(shù)G(N) = (B(n) >> 1)?XOR?B(n)

單個(gè)位

格雷碼轉(zhuǎn)換成二進(jìn)制碼

二進(jìn)制格雷碼轉(zhuǎn)換成二進(jìn)制碼,其法則是保留格雷碼的最高位作為自然二進(jìn)制碼的最高位,而次高位自然二進(jìn)制碼為高位自然二進(jìn)制碼與次高位格雷碼相異或,而自然二進(jìn)制碼的其余各位與次高位自然二進(jìn)制碼的求法相類(lèi)似。

公式表示:

格雷碼轉(zhuǎn)換為二進(jìn)制碼算法有以下幾種表述形式:

表述一:

二進(jìn)制格雷碼為Gn-1Gn-2...G2G1G0

自然二進(jìn)制碼為Bn -1Bn-2...B2B1B0

其中:最高位保留? Bn-1=Gn-1

其他各位? Bi-1=Gi-1 xor Bi ,i=1,2,...,n-1

表述二:

Bi = ?G[n-1:i]=G[n-1]?G[n-2]?..?G[i],i=0,1,...,n-1

表述三:

Bi = ?(G>>i),i=0,1,...,n-1

二進(jìn)制格雷碼字符串生成

c++ stl遞歸和非遞歸代碼

vector gray0(int n) {

/*

* 格雷碼字符串的直接排列遞歸實(shí)現(xiàn)

* 思路:1、獲得n-1位生成格雷碼的數(shù)組

* 2、由于n位生成的格雷碼位數(shù)是n-1的兩倍,故只要在n為格雷碼的前半部分加0,后半部分加1即可。

*/

if (n == 0)

return vector{"0"};

else if (n == 1) {

return vector({"0", "1"});

} else {

vector new_gray_code;

vector gray_code = gray0(n - 1);

// vector gray_code = vector({"0", "1"});

vector::iterator gc_it;

for (gc_it = gray_code.begin(); gc_it != gray_code.end(); gc_it++)

new_gray_code.push_back("0" + *gc_it);

vector::reverse_iterator gc_rit;

for (gc_rit = gray_code.rbegin(); gc_rit != gray_code.rend(); gc_rit++)

new_gray_code.push_back("1" + *gc_rit);

return new_gray_code;

}

}

vector gray1(int n) {

/*

* 格雷碼字符串的鏡射排列非遞歸實(shí)現(xiàn)

*/

if (n == 0)

return vector{"0"};

vector gray_code = vector({"0", "1"});

while (--n) {

vector new_gray_code;

vector::iterator gc_it;

for (gc_it = gray_code.begin(); gc_it != gray_code.end(); gc_it++)

new_gray_code.push_back("0" + *gc_it);

vector::reverse_iterator gc_rit;

for (gc_rit = gray_code.rbegin(); gc_rit != gray_code.rend(); gc_rit++)

new_gray_code.push_back("1" + *gc_rit);

gray_code = new_gray_code;

}

return gray_code;

}

格雷碼還有一種實(shí)現(xiàn)方式是根據(jù)這個(gè)公式來(lái)的 G(n) = ?B(n) XOR B(n+1), 這也是格雷碼和二進(jìn)制碼的轉(zhuǎn)換公式。代碼如下:

public void getGrayCode(int bitNum){

for(int i = 0; i < (int)Math.pow(2, bitNum); i++){

int grayCode = (i >> 1) ^ i;

System.out.println(num2Binary(grayCode, bitNum));

}

}

public String num2Binary(int num, int bitNum){

String ret = "";

for(int i = bitNum-1; i >= 0; i--){

ret += (num >> i) & 1;

}

return ret;

}

格雷碼&lpar;Gray code&rpar;仿真

作者:桂. 時(shí)間:2018-05-12??16:25:02 鏈接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的計(jì)數(shù)用的是格雷碼, ...

Android源碼下載方法詳解

轉(zhuǎn)自:http://www.cnblogs.com/anakin/archive/2011/12/20/2295276.html Android源碼下載方法詳解 相信很多下載過(guò)內(nèi)核的人都對(duì)這個(gè)很熟悉 ...

ANDROID自定義視圖——onMeasure,MeasureSpec源碼&&num;160&semi;流程&&num;160&semi;思路詳解

簡(jiǎn)介: 在自定義view的時(shí)候,其實(shí)很簡(jiǎn)單,只需要知道3步驟: 1.測(cè)量--onMeasure():決定View的大小 2.布局--onLayout():決定View在ViewGroup中的位置 3. ...

&lbrack;Spark內(nèi)核&rsqb; 第41課:Checkpoint徹底解密:Checkpoint的運(yùn)行原理和源碼實(shí)現(xiàn)徹底詳解

本課主題 Checkpoint?運(yùn)行原理圖 Checkpoint?源碼解析 引言 Checkpoint 到底是什么和需要用 Checkpoint 解決什么問(wèn)題: Spark 在生產(chǎn)環(huán)境下經(jīng)常會(huì)面臨 T ...

【Java】HashMap源碼分析——常用方法詳解

上一篇介紹了HashMap的基本概念,這一篇著重介紹HasHMap中的一些常用方法:put()get()**resize()** 首先介紹resize()這個(gè)方法,在我看來(lái)這是HashMap中一個(gè)非常 ...

【轉(zhuǎn)】ANDROID自定義視圖——onMeasure,MeasureSpec源碼 流程 思路詳解

總結(jié)

以上是生活随笔為你收集整理的gray code java_格雷码Gray Code详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。