BitField.SampleLogic.Mul C# (CSharp) Method

Mul() public static method

乗算器。
public static Mul ( BitField a, BitField b ) : BitField
a BitField オペランド1
b BitField オペランド2
return BitField
		public static BitField Mul(BitField a, BitField b)
		{
			bool sgn = a[a.Msb] ^ b[b.Msb];
			BitField p = BitField.Create(63, 0);
			BitField q = BitField.Create(31, 0);

			if(a[a.Msb]) a = Negate(a);
			if(b[b.Msb]) b = Negate(b);

			p.Assign(BitField.Concat(BitField.Create(31, 0, 0), a));
			q.Assign(b);

			for(int i=0; i<32; ++i)
			{
				BitField addin1, addin2, addout;

				addin1 = p[63, 32];
				addin2 = q;
				addout = addin1 + addin2;

				if(p[0])
					p.Assign(BitField.Concat(BitField.Create(0, 0, 0), addout, p[31, 1]));
				else
					p.Assign(BitField.Concat(BitField.Create(0, 0, 0), p[63, 1]));
			}

			if(sgn) p = Negate(p);

			return p;
		}

Usage Example

Example #1
0
        /// <summary>
        /// Mul のテスト
        /// </summary>
        /// <param name="m">テスト入力(オペランド1)</param>
        /// <param name="n">テスト入力(オペランド2)</param>
        static void TestMul(ulong m, ulong n)
        {
            BitField a, b;

            a = BitField.Create(31, 0, m);
            b = BitField.Create(31, 0, n);

            BitField p = SampleLogic.Mul(a, b);

            ulong tmp1 = p.Value;
            ulong tmp2 = unchecked ((ulong)((long)(int)a.Value * (long)(int)b.Value));

            Console.Write("{0:x8}×{1:x8} = ", (int)a.Value, (int)b.Value);
            Console.Write("{0:x16} ({1:x16})", tmp1, tmp2);

            if (tmp1 != tmp2)
            {
                Console.Write(" ** ");
                Console.ReadLine();
            }
            Console.Write("\n");
        }