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;
}