.NET中的格雷码

在.NET框架中的任何地方都有内置的格雷码数据类型吗? 或者Gray和binary之间的转换实用程序? 我可以自己做,但如果轮子已经发明了……

使用这个技巧 。

/* The purpose of this function is to convert an unsigned binary number to reflected binary Gray code. */ unsigned short binaryToGray(unsigned short num) { return (num>>1) ^ num; } 

一个棘手的技巧:对于最多2 ^ n位,您可以通过执行(2 ^ n) – 1二进制到格雷转换将灰度转换为二进制。 您只需要上面的函数和’for’循环。

 /* The purpose of this function is to convert a reflected binary Gray code number to a binary number. */ unsigned short grayToBinary(unsigned short num) { unsigned short temp = num ^ (num>>8); temp ^= (temp>>4); temp ^= (temp>>2); temp ^= (temp>>1); return temp; } 

这是一个C#实现,假设您只想在非负32位整数上执行此操作:

 static uint BinaryToGray(uint num) { return (num>>1) ^ num; } 

您可能还想阅读此博客文章 ,其中提供了双向转换方法,但作者选择将代码表示为int数组,每个位置包含一个或零。 我个人认为BitArray可能是更好的选择。

也许这个方法集合很有用

  • 基于BitArray
  • 两个方向
  • int或只是n位

享受就好。

 public static class GrayCode { public static byte BinaryToByte(BitArray binary) { if (binary.Length > 8) throw new ArgumentException("bitarray too long for byte"); var array = new byte[1]; binary.CopyTo(array, 0); return array[0]; } public static int BinaryToInt(BitArray binary) { if (binary.Length > 32) throw new ArgumentException("bitarray too long for int"); var array = new int[1]; binary.CopyTo(array, 0); return array[0]; } public static BitArray BinaryToGray(BitArray binary) { var len = binary.Length; var gray = new BitArray(len); gray[len - 1] = binary[len - 1]; // copy high-order bit for (var i = len - 2; i >= 0; --i) { // remaining bits gray[i] = binary[i] ^ binary[i + 1]; } return gray; } public static BitArray GrayToBinary(BitArray gray) { var len = gray.Length; var binary = new BitArray(len); binary[len - 1] = gray[len - 1]; // copy high-order bit for (var i = len - 2; i >= 0; --i) { // remaining bits binary[i] = !gray[i] ^ !binary[i + 1]; } return binary; } public static BitArray ByteToGray(byte value) { var bits = new BitArray(new[] { value }); return BinaryToGray(bits); } public static BitArray IntToGray(int value) { var bits = new BitArray(new[] { value }); return BinaryToGray(bits); } public static byte GrayToByte(BitArray gray) { var binary = GrayToBinary(gray); return BinaryToByte(binary); } public static int GrayToInt(BitArray gray) { var binary = GrayToBinary(gray); return BinaryToInt(binary); } ///  /// Returns the bits as string of '0' and '1' (LSB is right) ///  ///  ///  public static string AsString(this BitArray bits) { var sb = new StringBuilder(bits.Length); for (var i = bits.Length - 1; i >= 0; i--) { sb.Append(bits[i] ? "1" : "0"); } return sb.ToString(); } public static IEnumerable Bits(this BitArray bits) { return bits.Cast(); } public static bool[] AsBoolArr(this BitArray bits, int count) { return bits.Bits().Take(count).ToArray(); } } 

就.NET中的格雷代码而言,没有任何内置function

关于格雷码转换的图形说明 – 这可以帮助一点