關於格雷碼

2021-08-31 01:38:54 字數 2004 閱讀 5401

典型二進位制格雷碼(binary gray code)簡稱格雷碼,因2023年公開的弗蘭克·格雷(frank gray,18870913-19690523)專利「pulse code communication」而得名。

在一組數的編碼中,若任意兩個相鄰的**只有一位二進位制數不同,則稱這種編碼為格雷碼(gray code),另外由於最大數與最小數之間也僅一位數不同,即「首尾相連」,因此又稱迴圈碼反射碼。在數字系統中,常要求**按一定順序變化。例如,按自然數遞增計數,若採用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它**(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。格雷碼有多種編碼形式,一般不做說明都是指典型格雷碼。

格雷碼的多種編碼形式

十進位制數

4位自然二進位製碼

4位典型格雷碼

十進位制餘三格雷碼

十進位制空六格雷碼

十進位制跳六格雷碼

步進碼0000

0001

0011

0010

0110

0111

0101

0100

1100

1101

1111

1110

1010

1011

1001

1000

----

----

----

----

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

這種方法基於格雷碼是反射碼的事實,利用遞迴的如下規則來構造:

1位格雷碼有兩個碼字

(n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加字首0

(n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加字首1 [4]

n+1位格雷碼的集合 = n位格雷碼集合(順序)加字首0 + n位格雷碼集合(逆序)加字首1

二進位製碼→格雷碼(編碼)

此方法從對應的n位二進位制碼字中直接得到n位格雷碼碼字,步驟如下:

對n位二進位制的碼字,從右到左,以0到n-1編號

如果二進位制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1(當i+1=n時,二進位制碼字的第n位被認為是0,即第n-1位不變) ,即n位的二進位製碼的低位與相鄰高位進行異或,異或結果替換當前位

公式表示

(g:格雷碼,b:二進位製碼)

通俗來講:保留二進位製碼最高位作為格雷碼最高位,而次高位格雷碼為二進位製碼的高位於次高位相異或結果,其餘低位類似。

二進位制數                                                 1 0 1 1 0

二進位制數右移一位,空位補0   

01 0 1 1

異或運算                                                 1 1 1 0 1     

一句話:右移並且異或。

verilog實現: assign wgraynext = (wbinnext >>1) ^wbinnext。                         

關於BCD和格雷碼

1 原來關於keil的debug的printf用法,其實並沒有像當初寫這篇博文那樣麻煩。只是需要ti 1 再加上 stdio.h就行了。2 unsigned long最大可達42億,10位。bcd碼,感覺以前沒怎麼在意,其實用的也最多了。實際上就是4位二進位制數構成0 9的1位十進位制數,取值範圍0...

生成格雷碼

程式設計題 生成格雷碼 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 思想 用遞迴法實現,把求n位格雷碼分解為求n 1...

生成格雷碼

題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 1 n 1時,返回0,1 2 n 2時,返回00,01,10,...