コード例 #1
0
        public IEnumerator <Color> GetEnumerator()
        {
            ulong alpha_dxt3     = 0;
            byte  alpha0_dxt5    = 0;
            byte  alpha1_dxt5    = 0;
            ulong alphabits_dxt5 = 0;

            for (long i = 0; i < BlockCount; ++i)
            {
                if (Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT3_EXT)
                {
                    byte a0 = SourceStream.ReadUInt8();
                    byte a1 = SourceStream.ReadUInt8();
                    byte a2 = SourceStream.ReadUInt8();
                    byte a3 = SourceStream.ReadUInt8();
                    byte a4 = SourceStream.ReadUInt8();
                    byte a5 = SourceStream.ReadUInt8();
                    byte a6 = SourceStream.ReadUInt8();
                    byte a7 = SourceStream.ReadUInt8();
                    alpha_dxt3 = a0 + 256u * (a1 + 256u * (a2 + 256u * (a3 + 256u * (a4 + 256u * (a5 + 256u * (a6 + 256u * (ulong)a7))))));
                }
                else if (Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT5_EXT)
                {
                    alpha0_dxt5 = SourceStream.ReadUInt8();
                    alpha1_dxt5 = SourceStream.ReadUInt8();
                    byte abits_0 = SourceStream.ReadUInt8();
                    byte abits_1 = SourceStream.ReadUInt8();
                    byte abits_2 = SourceStream.ReadUInt8();
                    byte abits_3 = SourceStream.ReadUInt8();
                    byte abits_4 = SourceStream.ReadUInt8();
                    byte abits_5 = SourceStream.ReadUInt8();
                    alphabits_dxt5 = abits_0 + 256u * (abits_1 + 256u * (abits_2 + 256u * (abits_3 + 256u * (abits_4 + 256u * (ulong)abits_5))));
                }
                byte c0_lo;
                byte c0_hi;
                byte c1_lo;
                byte c1_hi;
                byte bits_0;
                byte bits_1;
                byte bits_2;
                byte bits_3;
                if (Format == DxtFormat.GamecubeCMPR)
                {
                    c0_hi = SourceStream.ReadUInt8();
                    c0_lo = SourceStream.ReadUInt8();
                    c1_hi = SourceStream.ReadUInt8();
                    c1_lo = SourceStream.ReadUInt8();
                    // TODO: is this right?
                    bits_1 = SourceStream.ReadUInt8();
                    bits_0 = SourceStream.ReadUInt8();
                    bits_3 = SourceStream.ReadUInt8();
                    bits_2 = SourceStream.ReadUInt8();
                }
                else
                {
                    c0_lo  = SourceStream.ReadUInt8();
                    c0_hi  = SourceStream.ReadUInt8();
                    c1_lo  = SourceStream.ReadUInt8();
                    c1_hi  = SourceStream.ReadUInt8();
                    bits_0 = SourceStream.ReadUInt8();
                    bits_1 = SourceStream.ReadUInt8();
                    bits_2 = SourceStream.ReadUInt8();
                    bits_3 = SourceStream.ReadUInt8();
                }
                ushort color0 = (ushort)(c0_lo + c0_hi * 256u);
                ushort color1 = (ushort)(c1_lo + c1_hi * 256u);
                uint   bits   = bits_0 + 256u * (bits_1 + 256u * (bits_2 + 256u * bits_3));

                uint _b0 = ((color0 & 0x001Fu)) & 0x1F;
                uint _g0 = ((color0 & 0x07E0u) >> 5) & 0x3F;
                uint _r0 = ((color0 & 0xF800u) >> 11) & 0x1F;
                uint _b1 = ((color1 & 0x001Fu)) & 0x1F;
                uint _g1 = ((color1 & 0x07E0u) >> 5) & 0x3F;
                uint _r1 = ((color1 & 0xF800u) >> 11) & 0x1F;

                // placing the high bits into the low bits of the result isn't explicitly said in the OpenGL extension doc,
                // but is suggested in various places on the internet and gets us closer to the reference readdxt output
                // I assume the idea here is that we want to scale better over the entire [0,255] color range
                // instead of arbitrarily clamping at [0,252] or [0,248], which makes sense
                int b0 = (int)((_b0 << 3) | (_b0 >> 2));
                int g0 = (int)((_g0 << 2) | (_g0 >> 4));
                int r0 = (int)((_r0 << 3) | (_r0 >> 2));
                int b1 = (int)((_b1 << 3) | (_b1 >> 2));
                int g1 = (int)((_g1 << 2) | (_g1 >> 4));
                int r1 = (int)((_r1 << 3) | (_r1 >> 2));

                for (int j = 0; j < 16; ++j)
                {
                    int code = BitUtils.ExtractBit(bits, j * 2) + BitUtils.ExtractBit(bits, j * 2 + 1) * 2;

                    int a;
                    if (Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT3_EXT)
                    {
                        int alpha =
                            BitUtils.ExtractBit(alpha_dxt3, j * 4) +
                            BitUtils.ExtractBit(alpha_dxt3, j * 4 + 1) * 2 +
                            BitUtils.ExtractBit(alpha_dxt3, j * 4 + 2) * 4 +
                            BitUtils.ExtractBit(alpha_dxt3, j * 4 + 3) * 8;

                        // same idea as the color bits here, instead of leaving the low bits empty shove the high bits in
                        // to interpolate better over the whole range
                        a = alpha << 4 | alpha;
                    }
                    else if (Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT5_EXT)
                    {
                        int acode =
                            BitUtils.ExtractBit(alphabits_dxt5, j * 3) +
                            BitUtils.ExtractBit(alphabits_dxt5, j * 3 + 1) * 2 +
                            BitUtils.ExtractBit(alphabits_dxt5, j * 3 + 2) * 4;

                        if (alpha0_dxt5 > alpha1_dxt5)
                        {
                            switch (acode)
                            {
                            case 0: a = alpha0_dxt5; break;

                            case 1: a = alpha1_dxt5; break;

                            case 2: a = (6 * alpha0_dxt5 + 1 * alpha1_dxt5) / 7; break;

                            case 3: a = (5 * alpha0_dxt5 + 2 * alpha1_dxt5) / 7; break;

                            case 4: a = (4 * alpha0_dxt5 + 3 * alpha1_dxt5) / 7; break;

                            case 5: a = (3 * alpha0_dxt5 + 4 * alpha1_dxt5) / 7; break;

                            case 6: a = (2 * alpha0_dxt5 + 5 * alpha1_dxt5) / 7; break;

                            case 7: a = (1 * alpha0_dxt5 + 6 * alpha1_dxt5) / 7; break;

                            default: throw new Exception("Invalid alpha code.");
                            }
                        }
                        else
                        {
                            switch (acode)
                            {
                            case 0: a = alpha0_dxt5; break;

                            case 1: a = alpha1_dxt5; break;

                            case 2: a = (4 * alpha0_dxt5 + 1 * alpha1_dxt5) / 5; break;

                            case 3: a = (3 * alpha0_dxt5 + 2 * alpha1_dxt5) / 5; break;

                            case 4: a = (2 * alpha0_dxt5 + 3 * alpha1_dxt5) / 5; break;

                            case 5: a = (1 * alpha0_dxt5 + 4 * alpha1_dxt5) / 5; break;

                            case 6: a = 0; break;

                            case 7: a = 0xFF; break;

                            default: throw new Exception("Invalid alpha code.");
                            }
                        }
                    }
                    else
                    {
                        a = 0xFF;
                    }

                    if (Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT3_EXT || Format == DxtFormat.COMPRESSED_RGBA_S3TC_DXT5_EXT || color0 > color1)
                    {
                        switch (code)
                        {
                        case 0: yield return(Color.FromArgb(a, r0, g0, b0)); break;

                        case 1: yield return(Color.FromArgb(a, r1, g1, b1)); break;

                        case 2: yield return(InterpolateThirds(r0, g0, b0, r1, g1, b1, a)); break;

                        case 3: yield return(InterpolateThirds(r1, g1, b1, r0, g0, b0, a)); break;

                        default: throw new Exception("Invalid code.");
                        }
                    }
                    else
                    {
                        switch (code)
                        {
                        case 0: yield return(Color.FromArgb(a, r0, g0, b0)); break;

                        case 1: yield return(Color.FromArgb(a, r1, g1, b1)); break;

                        case 2: yield return(InterpolateHalf(r0, g0, b0, r1, g1, b1, a)); break;

                        case 3:
                            if (Format == DxtFormat.GamecubeCMPR)
                            {
                                yield return(InterpolateThirds(r1, g1, b1, r0, g0, b0, 0)); break;
                            }
                            else
                            {
                                yield return(Color.FromArgb(Format == DxtFormat.COMPRESSED_RGB_S3TC_DXT1_EXT ? 0xFF : 0, 0, 0, 0)); break;
                            }

                        default: throw new Exception("Invalid code.");
                        }
                    }
                }
            }
        }
コード例 #2
0
        public void ExtractBitTest()
        {
            Assert.AreEqual(0, BitUtils.ExtractBit(0x00000000u, 0));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x00000000u, 1));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x00000000u, 31));
            Assert.AreEqual(1, BitUtils.ExtractBit(0xFFFFFFFFu, 0));
            Assert.AreEqual(1, BitUtils.ExtractBit(0xFFFFFFFFu, 1));
            Assert.AreEqual(1, BitUtils.ExtractBit(0xFFFFFFFFu, 31));

            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 0));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 1));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 2));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 3));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 4));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 5));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 6));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 7));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 8));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 9));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 10));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 11));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 12));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 13));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 14));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 15));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 16));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 17));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 18));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 19));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 20));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 21));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 22));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 23));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 24));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 25));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 26));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 27));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 28));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 29));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x4B603B9Au, 30));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x4B603B9Au, 31));

            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFFEu, 0));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFFDu, 1));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFFBu, 2));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFF7u, 3));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFEFu, 4));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFDFu, 5));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFFBFu, 6));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFF7Fu, 7));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFEFFu, 8));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFDFFu, 9));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFFBFFu, 10));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFF7FFu, 11));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFEFFFu, 12));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFDFFFu, 13));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFFBFFFu, 14));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFF7FFFu, 15));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFEFFFFu, 16));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFDFFFFu, 17));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFFBFFFFu, 18));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFF7FFFFu, 19));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFEFFFFFu, 20));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFDFFFFFu, 21));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFFBFFFFFu, 22));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFF7FFFFFu, 23));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFEFFFFFFu, 24));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFDFFFFFFu, 25));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xFBFFFFFFu, 26));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xF7FFFFFFu, 27));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xEFFFFFFFu, 28));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xDFFFFFFFu, 29));
            Assert.AreEqual(0, BitUtils.ExtractBit(0xBFFFFFFFu, 30));
            Assert.AreEqual(0, BitUtils.ExtractBit(0x7FFFFFFFu, 31));

            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000001u, 0));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000002u, 1));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000004u, 2));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000008u, 3));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000010u, 4));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000020u, 5));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000040u, 6));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000080u, 7));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000100u, 8));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000200u, 9));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000400u, 10));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00000800u, 11));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00001000u, 12));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00002000u, 13));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00004000u, 14));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00008000u, 15));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00010000u, 16));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00020000u, 17));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00040000u, 18));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00080000u, 19));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00100000u, 20));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00200000u, 21));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00400000u, 22));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x00800000u, 23));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x01000000u, 24));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x02000000u, 25));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x04000000u, 26));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x08000000u, 27));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x10000000u, 28));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x20000000u, 29));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x40000000u, 30));
            Assert.AreEqual(1, BitUtils.ExtractBit(0x80000000u, 31));

            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0x0000000000000000u, 0));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0x0000000000000000u, 1));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0x0000000000000000u, 63));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFFu, 0));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFFu, 1));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFFu, 63));

            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFEu, 0));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFDu, 1));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFFBu, 2));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFF7u, 3));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFEFu, 4));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFDFu, 5));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFFBFu, 6));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFF7Fu, 7));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFEFFu, 8));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFDFFu, 9));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFFBFFu, 10));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFF7FFu, 11));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFEFFFu, 12));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFDFFFu, 13));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFFBFFFu, 14));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFF7FFFu, 15));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFEFFFFu, 16));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFDFFFFu, 17));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFFBFFFFu, 18));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFF7FFFFu, 19));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFEFFFFFu, 20));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFDFFFFFu, 21));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFFBFFFFFu, 22));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFF7FFFFFu, 23));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFEFFFFFFu, 24));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFDFFFFFFu, 25));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFFBFFFFFFu, 26));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFF7FFFFFFu, 27));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFEFFFFFFFu, 28));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFDFFFFFFFu, 29));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFFBFFFFFFFu, 30));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFF7FFFFFFFu, 31));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFEFFFFFFFFu, 32));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFDFFFFFFFFu, 33));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFFBFFFFFFFFu, 34));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFF7FFFFFFFFu, 35));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFEFFFFFFFFFu, 36));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFDFFFFFFFFFu, 37));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFFBFFFFFFFFFu, 38));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFF7FFFFFFFFFu, 39));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFEFFFFFFFFFFu, 40));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFDFFFFFFFFFFu, 41));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFFBFFFFFFFFFFu, 42));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFF7FFFFFFFFFFu, 43));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFEFFFFFFFFFFFu, 44));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFDFFFFFFFFFFFu, 45));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFFBFFFFFFFFFFFu, 46));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFF7FFFFFFFFFFFu, 47));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFEFFFFFFFFFFFFu, 48));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFDFFFFFFFFFFFFu, 49));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFFBFFFFFFFFFFFFu, 50));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFF7FFFFFFFFFFFFu, 51));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFEFFFFFFFFFFFFFu, 52));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFDFFFFFFFFFFFFFu, 53));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFFBFFFFFFFFFFFFFu, 54));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFF7FFFFFFFFFFFFFu, 55));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFEFFFFFFFFFFFFFFu, 56));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFDFFFFFFFFFFFFFFu, 57));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xFBFFFFFFFFFFFFFFu, 58));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xF7FFFFFFFFFFFFFFu, 59));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xEFFFFFFFFFFFFFFFu, 60));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xDFFFFFFFFFFFFFFFu, 61));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0xBFFFFFFFFFFFFFFFu, 62));
            Assert.AreEqual(0, BitUtils.ExtractBit((ulong)0x7FFFFFFFFFFFFFFFu, 63));

            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000001u, 0));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000002u, 1));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000004u, 2));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000008u, 3));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000010u, 4));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000020u, 5));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000040u, 6));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000080u, 7));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000100u, 8));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000200u, 9));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000400u, 10));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000000800u, 11));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000001000u, 12));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000002000u, 13));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000004000u, 14));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000008000u, 15));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000010000u, 16));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000020000u, 17));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000040000u, 18));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000080000u, 19));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000100000u, 20));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000200000u, 21));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000400000u, 22));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000000800000u, 23));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000001000000u, 24));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000002000000u, 25));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000004000000u, 26));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000008000000u, 27));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000010000000u, 28));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000020000000u, 29));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000040000000u, 30));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000080000000u, 31));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000100000000u, 32));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000200000000u, 33));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000400000000u, 34));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000000800000000u, 35));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000001000000000u, 36));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000002000000000u, 37));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000004000000000u, 38));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000008000000000u, 39));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000010000000000u, 40));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000020000000000u, 41));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000040000000000u, 42));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000080000000000u, 43));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000100000000000u, 44));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000200000000000u, 45));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000400000000000u, 46));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0000800000000000u, 47));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0001000000000000u, 48));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0002000000000000u, 49));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0004000000000000u, 50));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0008000000000000u, 51));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0010000000000000u, 52));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0020000000000000u, 53));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0040000000000000u, 54));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0080000000000000u, 55));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0100000000000000u, 56));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0200000000000000u, 57));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0400000000000000u, 58));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x0800000000000000u, 59));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x1000000000000000u, 60));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x2000000000000000u, 61));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x4000000000000000u, 62));
            Assert.AreEqual(1, BitUtils.ExtractBit((ulong)0x8000000000000000u, 63));
        }