X-Git-Url: https://mattmccutchen.net/bigint/bigint.git/blobdiff_plain/a8b42b686243a175ea328c74609c7de6a0163274..a82332d03045a6029b01b694cdca1acdb85ecadf:/BigUnsigned.cc diff --git a/BigUnsigned.cc b/BigUnsigned.cc index 4074822..ad96026 100644 --- a/BigUnsigned.cc +++ b/BigUnsigned.cc @@ -1,6 +1,5 @@ /* * Matt McCutchen's Big Integer Library -* http://mysite.verizon.net/mccutchen/bigint/ */ #include "BigUnsigned.hh" @@ -428,7 +427,7 @@ void BigUnsigned::multiply(const BigUnsigned &a, const BigUnsigned &b) { for (i = 0; i < a.len; i++) { // For each 1-bit of that block... for (i2 = 0; i2 < N; i2++) { - if ((a.blk[i] & (1 << i2)) == 0) + if ((a.blk[i] & (Blk(1) << i2)) == 0) continue; /* * Add b to this, shifted left i blocks and i2 bits. @@ -563,8 +562,9 @@ void BigUnsigned::divideWithRemainder(const BigUnsigned &b, BigUnsigned &q) { * amusing story of this section of code. */ Index origLen = len; // Save real length. + // 2006.05.03: Copy the number and then change the length! + allocateAndCopy(len + 1); // Get the space. len++; // Increase the length. - allocateAndCopy(len); // Get the space. blk[origLen] = 0; // Zero the extra block. // work2 holds part of the result of a subtraction; see above. @@ -623,7 +623,7 @@ void BigUnsigned::divideWithRemainder(const BigUnsigned &b, BigUnsigned &q) { * the region of work2 we copy is just [i, k). */ if (!borrowIn) { - q.blk[i] |= (1 << i2); + q.blk[i] |= (Blk(1) << i2); while (k > i) { k--; blk[k] = work2[k]; @@ -731,7 +731,7 @@ void BigUnsigned::bitXor(const BigUnsigned &a, const BigUnsigned &b) { a2 = &b; b2 = &a; } - allocate(b2->len); + allocate(a2->len); for (i = 0; i < b2->len; i++) blk[i] = a2->blk[i] ^ b2->blk[i]; for (; i < a2->len; i++) @@ -752,8 +752,10 @@ void BigUnsigned::operator ++() { } if (carry) { // Matt fixed a bug 2004.12.24: next 2 lines used to say allocateAndCopy(len + 1) + // Matt fixed another bug 2006.04.24: + // old number only has len blocks, so copy before increasing length + allocateAndCopy(len + 1); len++; - allocateAndCopy(len); blk[i] = 1; } }