コード例 #1
0
        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);
        }
コード例 #2
0
 public void TestNlzBitwiseViaNlz()
 {
     for (int i = -100; i < 100; ++i)
     {
         Assert.AreEqual(Tricks.NlzBitwise((uint)i), Tricks.Nlz((uint)i));
     }
 }
コード例 #3
0
 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));
 }
コード例 #4
0
        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);
        }
コード例 #5
0
 public static int GetMinBits(this uint value)
 {
     return(32 - Tricks.Nlz(value));
 }