示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test5
{
class Program
{
static void Main(string[] args)
{
/**
* 雷格码特点
* 1.任意相邻的两个码只有1位二进制数不同
* 2.最大数与最小数之间也仅有1位二进制数不同(即,首尾相连)
*/
Console.WriteLine("二进制 格雷码->二进制");
Console.WriteLine("abcd efgh");//abcd efgh表示对应的列
//二进制码转雷格码公式为: e=a, f=a^b, g=b^c, h=c^d
//雷格码转二进制码公式为: a=e, b=e^f, c=e^f^g, d=e^f^g^h
for (int i = 0; i < 16; i++){
int grayCode = DecimalToGray(i);
Console.WriteLine(string.Format("{0} {1} {2}", IntToBinary(i, 4), IntToBinary(grayCode, 4), IntToBinary(GrayToDecimal(grayCode), 4)));
}
Console.WriteLine("二进制码转雷格码公式为: e=a, f=a^b, g=b^c, h=c^d");
Console.WriteLine("雷格码转二进制码公式为: a=e, b=e^f, c=e^f^g, d=e^f^g^h");
Console.Read();
}
//二进制码转格雷码
public static int DecimalToGray(int x)
{
return x^(x>>1);
}
//格雷码转二进制码
//写法一
//更多代码写法参考: http://blog.csdn.net/jingfengvae/article/details/51691124
public static int GrayToDecimal(int x)
{
int y = x;
while((x>>=1) > 0)
y ^= x;
return y;
}
//格雷码转二进制码
//写法二
public static int GrayToDecimal2(int x)
{
x ^= (x >> 1);
x ^= (x >> 2);
x ^= (x >> 4);
x ^= (x >> 8);
x ^= (x >> 16);
return x;
}
//整数转二进制串
public static string IntToBinary(int val, int bits = 32)
{
string final = "";
for (int i = bits; i > 0; )
{
if (i == 8 || i == 16 || i == 24) final += " ";
final += ((val & (1 << --i)) != 0) ? '1' : '0';
}
return final;
}
}
}
运行测试