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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gray code java_格雷码Gray Code详解

發布時間:2024/1/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gray code java_格雷码Gray Code详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

格雷碼簡介

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

格雷碼有多種編碼形式

十進制數

4位自然二進制碼

4位典型格雷碼

十進制余三格雷碼

十進制空六格雷碼

十進制跳六格雷碼

步進碼

0

0000

0000

0010

0000

0000

00000

1

0001

0001

0110

0001

0001

00001

2

0010

0011

0111

0011

0011

00011

...

表中典型格雷碼具有代表性。若不作特別說明,格雷碼就是指典型格雷碼,它可從自然二進制碼轉換而來。

為什么要使用格雷碼?

格雷碼是一種具有反射特性和循環特性的單步自補碼,其循環和單步特性消除了隨機取數時出現重大錯誤的可能,其反射和自補特性使得對其進行求反操作也非常方便,所以,格雷碼屬于一種可靠性編碼,是一種錯誤最小化的編碼方式,因此格雷碼在通信和測量技術中得到廣泛應用。

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

在數字系統中,常要求代碼按一定順序變化。例如,按自然數遞增計數,若采用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它代碼(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。

格雷碼是一種絕對編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,它的循環、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。

由于格雷碼是一種變權碼,每一位碼沒有固定的大小,很難直接進行比較大小和算術運算,也不能直接轉換成液位信號,要經過一次碼變換,變成自然二進制碼,再由上位機讀取。

典型格雷碼是一種采用絕對編碼方式的準權碼,其權的絕對值為2^i-1(設最低位i=1)。

格雷碼的十進制數奇偶性與其碼字中1的個數的奇偶性相同。

應用

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

在化簡邏輯函數時,可以通過按格雷碼排列的卡諾圖來完成。

角度傳感器:汽車制動系統有時需要傳感器產生的數字值來指示機械位置。如圖是編碼盤和一些觸點的概念圖,根據盤轉的位置,觸點產生一個3位二進制編碼,共有8個這樣的編碼。盤中暗的區域與對應的邏輯1的信號源相連;亮的區域沒有連接,觸點將其解釋為邏輯0。使用格雷碼對編碼盤上的亮暗區域編碼,使得其連續的碼字之間只有一個數位變化。這樣就不會因為器件制造的精確度有限,而使得觸點轉到邊界位置而出現錯誤編碼。

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

二進制格雷碼的生成

問題:產生n位元的所有格雷碼字符串表示。

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

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

如果要產生n位元的格雷碼,那么格雷碼的個數為2^n。

直接排列

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

假設原始的值從0開始,格雷碼產生的規律是:

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

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

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

用一個例子來說明:

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

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

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

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

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

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

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

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

鏡射排列

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

??

如果按照直接排列規則來生成格雷碼,是沒有問題的,但是這樣做太復雜了。如果仔細觀察格雷碼的結構,我們會有以下發現:

1、除了最高位(左邊第一位),格雷碼的位元完全上下對稱(看下面列表)。比如第一個格雷碼與最后一個格雷碼對稱(除了第一位),第二個格雷碼與倒數第二個對稱,以此類推。

2、最小的重復單元是 0 , 1。

000

001

011

010

110

111

101

100

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

比如:

第一步:產生 0, 1 兩個字符串。

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

第三步:在第二步的基礎上,再給每個字符串都加上0和1,同樣,每次只能加一個,這樣就變成了 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.

也就是說,n位元格雷碼是基于n-1位元格雷碼產生的。

[格雷碼維基百科]

其它方法

利用卡諾圖生成

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

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

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

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

利用二進制碼轉換

轉換方法參考下面吧。

格雷碼和二進制碼的轉換

自然二進制碼與格雷碼的對照表:

十進制數

自然二進制數

格雷碼

十進制數

自然二進制數

格雷碼

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

二進制碼轉換成二進制格雷碼

二進制碼轉換成二進制格雷碼,其法則是保留二進制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似。

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

Note: 這樣做可行的原因,是因為二進制碼每次+1時最多只有一個相鄰的兩個bit對的異或值會發生改變。

公式表示:G:格雷碼 B:二進制碼

整個數G(N) = (B(n) >> 1)?XOR?B(n)

單個位

格雷碼轉換成二進制碼

二進制格雷碼轉換成二進制碼,其法則是保留格雷碼的最高位作為自然二進制碼的最高位,而次高位自然二進制碼為高位自然二進制碼與次高位格雷碼相異或,而自然二進制碼的其余各位與次高位自然二進制碼的求法相類似。

公式表示:

格雷碼轉換為二進制碼算法有以下幾種表述形式:

表述一:

二進制格雷碼為Gn-1Gn-2...G2G1G0

自然二進制碼為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

二進制格雷碼字符串生成

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

vector gray0(int n) {

/*

* 格雷碼字符串的直接排列遞歸實現

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

* 2、由于n位生成的格雷碼位數是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) {

/*

* 格雷碼字符串的鏡射排列非遞歸實現

*/

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;

}

格雷碼還有一種實現方式是根據這個公式來的 G(n) = ?B(n) XOR B(n+1), 這也是格雷碼和二進制碼的轉換公式。代碼如下:

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;仿真

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

Android源碼下載方法詳解

轉自:http://www.cnblogs.com/anakin/archive/2011/12/20/2295276.html Android源碼下載方法詳解 相信很多下載過內核的人都對這個很熟悉 ...

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

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

&lbrack;Spark內核&rsqb; 第41課:Checkpoint徹底解密:Checkpoint的運行原理和源碼實現徹底詳解

本課主題 Checkpoint?運行原理圖 Checkpoint?源碼解析 引言 Checkpoint 到底是什么和需要用 Checkpoint 解決什么問題: Spark 在生產環境下經常會面臨 T ...

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

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人天堂成人网 | 美女脱了内裤喂我喝尿视频 | 超碰资源 | 欧美福利网址 | 久久传媒| 辟里啪啦国语版免费观看 | 高清久久 | 五月婷婷六月天 | 亚洲av毛片成人精品 | 毛片毛片 | 亚洲国产成人精品女人久久久 | 欧美老熟妇乱大交xxxxx | 在线观看中文字幕第一页 | av一级免费 | 欧美 亚洲 另类 偷偷 自拍 | 亚洲天堂视频一区 | 五月天综合在线 | 免费在线观看日韩 | 亚洲综合欧美日韩 | 日韩久久免费视频 | 婷婷av在线 | 欧美国产日本 | 国产精品啪 | 美丽的姑娘在线观看免费 | 国产免费又粗又猛又爽 | 欧美日韩中文字幕在线视频 | 在线免费观看亚洲视频 | 六月丁香激情综合 | 欧美成年人在线观看 | 欧洲美女与动交zozzo | 久久精品免费 | 亚洲欧洲中文 | 男女互操视频 | 中文字幕观看在线 | 一区三区在线 | 国产一av | 精品福利视频一区二区 | 男人肌肌桶女人肌肌 | 国产在线国偷精品免费看 | 久久久久久久极品内射 | 亚洲日本网站 | 久久女同 | 成人综合在线观看 | 亚洲爱爱片 | 女同毛片一区二区三区 | 国产做受高潮漫动 | 在线播放的av | 美女免费视频网站 | 99日精品 | 国产成人aaaa | 毛片av免费 | 国产91黄色| 久久影视一区二区 | 18我禁在线观看 | 蜜臀麻豆 | 久久成人综合 | 人妻丝袜一区二区三区 | 少女国产免费观看 | 国产福利视频在线观看 | 亚洲国产精品国自产拍av | 欧美精品久 | 欧美三级韩国三级日本三斤在线观看 | 人妻互换一区二区三区四区五区 | 成人午夜影片 | 鲁片一区二区三区 | 中文字幕av一区二区三区人妻少妇 | 99视频国产精品免费观看a | 麻豆亚洲av熟女国产一区二 | 免费精品视频一区二区三区 | 蜜桃视频在线观看一区 | 黄色一级片免费观看 | 在线免费看黄色 | 免费国产黄色网址 | 白峰美羽在线播放 | 国产在线视频资源 | 葵司ssni-879在线播放 | 六月婷婷综合网 | 潘甜甜在线 | 亚洲永久免费 | 欧美激情图片 | 亚洲丁香婷婷 | 中文字幕网伦射乱中文 | 婷婷六月激情 | 三上悠亚中文字幕在线播放 | 天天干天天操心 | 大尺度做爰无遮挡露器官 | 少妇精品高潮欲妇又嫩中文字幕 | 黄色三级网络 | 激情爱爱网 | 美国伊人网 | 欧美人伦 | 两性动态视频 | 日本黄色小视频 | 国产高清在线观看视频 | 黄色av免费| 欧美日韩在线视频免费 | 免费毛片网站 | 高跟鞋调教—视频|vk | 国产综合久久 |