Gray code in .NET

后端 未结 5 1906
忘掉有多难
忘掉有多难 2021-01-03 01:05

Is there a built in Gray code datatype anywhere in the .NET framework? Or conversion utility between Gray and binary? I could do it myself, but if the wheel has already be

5条回答
  •  忘掉有多难
    2021-01-03 01:19

    Perhaps this collection of methods is useful

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

    just enjoy.

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

提交回复
热议问题