首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET中的格雷码

.NET中的格雷码
EN

Stack Overflow用户
提问于 2009-11-07 06:54:35
回答 5查看 4.7K关注 0票数 6

.NET框架中是否有内置的Gray code数据类型?或者Gray和binary之间的转换实用程序?我可以自己做,但是如果轮子已经发明了..。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-07 07:10:03

使用this trick

代码语言:javascript
复制
/*
        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个二进制到Gray的转换来将Gray转换为二进制。你所需要的就是上面的函数和一个'for‘循环。

代码语言:javascript
复制
/*
        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;
}
票数 13
EN

Stack Overflow用户

发布于 2012-02-22 15:46:33

下面是一个C#实现,它假设您只想对非负32位整数执行此操作:

代码语言:javascript
复制
static uint BinaryToGray(uint num)
{
    return (num>>1) ^ num;
}

您可能还想阅读this blog post,它提供了双向转换的方法,尽管作者选择将代码表示为在每个位置都包含1或0的int数组。就我个人而言,我认为BitArray可能是更好的选择。

票数 3
EN

Stack Overflow用户

发布于 2015-04-30 22:22:03

也许这个方法集合是有用的

  • based on BitArray
  • both
  • int or just n Bits

好好享受吧。

代码语言:javascript
复制
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);
    }

    /// <summary>
    ///     Returns the bits as string of '0' and '1' (LSB is right)
    /// </summary>
    /// <param name="bits"></param>
    /// <returns></returns>
    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<bool> Bits(this BitArray bits)
    {
        return bits.Cast<bool>();
    }

    public static bool[] AsBoolArr(this BitArray bits, int count)
    {
        return bits.Bits().Take(count).ToArray();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1691074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档