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."); } } } } }
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)); }