一、什麽是格雷碼?
格雷碼,又叫循環二進製碼或反射二進製碼,格雷碼是我們(men) 在工程中常會(hui) 遇到的一種編碼方式,它的基本的特點就是任意兩(liang) 個(ge) 相鄰的代碼隻有一位二進製數不同,這點在下麵會(hui) 詳細講解到。格雷碼的基本特點就是任意兩(liang) 個(ge) 相鄰的代碼隻有一位二進製數不同,這點很重要。常用的二進製數與(yu) 格雷碼間的轉換關(guan) 係如下表:
二、二進製格雷碼與自然二進製碼的互換
1、二進製碼轉換成二進製格雷碼
二進製碼轉換成二進製格雷碼,其法則是保留二進製碼的最高位作為(wei) 格雷碼的最高位,而次高位格雷碼為(wei) 二進製碼的高位與(yu) 次高位相異或,而格雷碼其餘(yu) 各位與(yu) 次高位的求法相類似。
轉換代碼:
//根據二進製轉換成格雷碼的法則,可以得到以下的代碼:
static unsigned int DecimaltoGray(unsigned int x)
{
return x^(x>>1);
}
//以上代碼實現了unsigned int型數據到格雷碼的轉換,最高可轉換32位自然二進製碼,超出32位將溢出。
static int DecimaltoGray( int x)
{
return x^(x>>1);
}
//以上代碼實現了 int型數據到格雷碼的轉換,最高可轉換31位自然二進製碼,超出31位將溢出。
2、二進製格雷碼轉換成二進製碼
二進製格雷碼轉換成二進製碼,其法則是保留格雷碼的最高位作為(wei) 自然二進製碼的最高位,而次高位自然二進製碼為(wei) 高位自然二進製碼與(yu) 次高位格雷碼相異或,而自然二進製碼的其餘(yu) 各位與(yu) 次高位自然二進製碼的求法相類似。
轉換代碼:
根據二進製格雷碼轉換成自然二進製碼的法則,可以得到以下的三種代碼方式:
static unsigned int GraytoDecimal(unsigned int x)
{
unsigned int y = x;
while(x>>=1)
y ^= x;
return y;
}
static unsigned int GraytoDecimal(unsigned int x)
{
x^=x>>16;
x^=x>>8;
x^=x>>4;
x^=X>>2;
x^=x^1;
return x;
}
static unsigned int GraytoDecimal(unsigned int x)
{
int i;
for(i=0;(1<<i)<sizeof(x)*8;i++)
{
x^=x>>(1<<i);
}
return x;
}
//以上代碼實現了unsigned int型數據到自然二進製碼的轉換,最高可轉換32位格雷碼,
超出32位將溢出。將數據類型改為int型即可實現31位格雷碼轉換。