6

.NET フレームワークのどこかに組み込みのグレイ コードデータ型はありますか? または、グレイとバイナリの間の変換ユーティリティですか? 自分でもできますが、車輪がすでに発明されている場合は...

4

5 に答える 5

3

非負の 32 ビット整数に対してのみこれを行うことを想定した C# 実装を次に示します。

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

著者は各位置に 1 または 0 のいずれかを含むの配列としてコードを表すことを選択しましたが、両方向の変換のメソッドを提供するこのブログ投稿を読むこともできます。個人的には、 a がより良い選択かもしれないintと思います。BitArray

于 2012-02-22T07:46:32.850 に答える
1

おそらく、このメソッドのコレクションは便利です

  • 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);
    }

    /// <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();
    }
}
于 2015-04-30T14:22:03.033 に答える
0

.NET のグレイ コードに関しては何も組み込まれていません。

于 2009-11-06T23:06:17.597 に答える
0

グレイコード変換に関するグラフィカルな説明- これは少し役に立ちます

于 2012-11-09T06:39:29.987 に答える