public static uint MulOvf(uint x, uint y) { int m = Tricks.Nlz(x); int n = Tricks.Nlz(y); if (m + n <= 30) { throw new OverflowException(); } uint t = x * (y >> 1); if ((int)t < 0) { throw new OverflowException(); } uint z = t * 2; if ((y & 1) != 0) { z = z + x; if (z < x) { throw new OverflowException(); } } return(z); }
public void TestNlzBitwiseViaNlz() { for (int i = -100; i < 100; ++i) { Assert.AreEqual(Tricks.NlzBitwise((uint)i), Tricks.Nlz((uint)i)); } }
public void TestNLZ() { Assert.AreEqual(32, Tricks.Nlz(0)); Assert.AreEqual(31, Tricks.Nlz(1)); Assert.AreEqual(16, Tricks.Nlz(0x0000FFFF)); Assert.AreEqual(14, Tricks.Nlz(0x0003FFFF)); Assert.AreEqual(0, Tricks.Nlz(0xF000FFFF)); }
public static int GetMinBits(this int value) { uint v = (uint)value; if (value >= 0) { return(v.GetMinBits() + 1); } v = ~v; int n = Tricks.Nlz(v); return(33 - n); }
public static int GetMinBits(this uint value) { return(32 - Tricks.Nlz(value)); }