yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
BigUnsigned Class Reference

#include <BigUnsigned.hh>

+ Inheritance diagram for BigUnsigned:
+ Collaboration diagram for BigUnsigned:

Public Types

enum  CmpRes { less = -1, equal = 0, greater = 1 }
 
typedef unsigned long Blk
 
typedef NumberlikeArray< Blk >
::Index 
Index
 

Public Member Functions

 BigUnsigned ()
 
 BigUnsigned (const BigUnsigned &x)
 
void operator= (const BigUnsigned &x)
 
 BigUnsigned (const Blk *b, Index blen)
 
 ~BigUnsigned ()
 
 BigUnsigned (unsigned long x)
 
 BigUnsigned (long x)
 
 BigUnsigned (unsigned int x)
 
 BigUnsigned (int x)
 
 BigUnsigned (unsigned short x)
 
 BigUnsigned (short x)
 
unsigned long toUnsignedLong () const
 
long toLong () const
 
unsigned int toUnsignedInt () const
 
int toInt () const
 
unsigned short toUnsignedShort () const
 
short toShort () const
 
Blk getBlock (Index i) const
 
void setBlock (Index i, Blk newBlock)
 
bool isZero () const
 
Index bitLength () const
 
bool getBit (Index bi) const
 
void setBit (Index bi, bool newBit)
 
CmpRes compareTo (const BigUnsigned &x) const
 
bool operator== (const BigUnsigned &x) const
 
bool operator!= (const BigUnsigned &x) const
 
bool operator< (const BigUnsigned &x) const
 
bool operator<= (const BigUnsigned &x) const
 
bool operator>= (const BigUnsigned &x) const
 
bool operator> (const BigUnsigned &x) const
 
void add (const BigUnsigned &a, const BigUnsigned &b)
 
void subtract (const BigUnsigned &a, const BigUnsigned &b)
 
void multiply (const BigUnsigned &a, const BigUnsigned &b)
 
void bitAnd (const BigUnsigned &a, const BigUnsigned &b)
 
void bitOr (const BigUnsigned &a, const BigUnsigned &b)
 
void bitXor (const BigUnsigned &a, const BigUnsigned &b)
 
void bitShiftLeft (const BigUnsigned &a, int b)
 
void bitShiftRight (const BigUnsigned &a, int b)
 
void divideWithRemainder (const BigUnsigned &b, BigUnsigned &q)
 
BigUnsigned operator+ (const BigUnsigned &x) const
 
BigUnsigned operator- (const BigUnsigned &x) const
 
BigUnsigned operator* (const BigUnsigned &x) const
 
BigUnsigned operator/ (const BigUnsigned &x) const
 
BigUnsigned operator% (const BigUnsigned &x) const
 
BigUnsigned operator& (const BigUnsigned &x) const
 
BigUnsigned operator| (const BigUnsigned &x) const
 
BigUnsigned operator^ (const BigUnsigned &x) const
 
BigUnsigned operator<< (int b) const
 
BigUnsigned operator>> (int b) const
 
void operator+= (const BigUnsigned &x)
 
void operator-= (const BigUnsigned &x)
 
void operator*= (const BigUnsigned &x)
 
void operator/= (const BigUnsigned &x)
 
void operator%= (const BigUnsigned &x)
 
void operator&= (const BigUnsigned &x)
 
void operator|= (const BigUnsigned &x)
 
void operator^= (const BigUnsigned &x)
 
void operator<<= (int b)
 
void operator>>= (int b)
 
void operator++ ()
 
void operator++ (int)
 
void operator-- ()
 
void operator-- (int)
 

Protected Member Functions

 BigUnsigned (int, Index c)
 
void zapLeadingZeros ()
 
template<class X >
void initFromPrimitive (X x)
 
template<class X >
void initFromSignedPrimitive (X x)
 
template<class X >
X convertToSignedPrimitive () const
 
template<class X >
X convertToPrimitive () const
 
void allocate (Index c)
 
void allocateAndCopy (Index c)
 
Index getCapacity () const
 
Index getLength () const
 
bool isEmpty () const
 
bool operator== (const NumberlikeArray< unsigned long > &x) const
 
bool operator!= (const NumberlikeArray< unsigned long > &x) const
 

Protected Attributes

Index cap
 
Index len
 
unsigned long * blk
 

Static Protected Attributes

static const unsigned int N
 

Friends

Blk getShiftedBlock (const BigUnsigned &num, Index x, unsigned int y)
 
template<class X >
X convertBigUnsignedToPrimitiveAccess (const BigUnsigned &a)
 

Detailed Description

Definition at line 13 of file BigUnsigned.hh.

Member Typedef Documentation

typedef unsigned long BigUnsigned::Blk

Definition at line 20 of file BigUnsigned.hh.

Definition at line 22 of file BigUnsigned.hh.

Member Enumeration Documentation

Enumerator
less 
equal 
greater 

Definition at line 17 of file BigUnsigned.hh.

Constructor & Destructor Documentation

BigUnsigned::BigUnsigned ( int  ,
Index  c 
)
inlineprotected

Definition at line 27 of file BigUnsigned.hh.

BigUnsigned::BigUnsigned ( )
inline

Definition at line 37 of file BigUnsigned.hh.

BigUnsigned::BigUnsigned ( const BigUnsigned x)
inline

Definition at line 40 of file BigUnsigned.hh.

BigUnsigned::BigUnsigned ( const Blk b,
Index  blen 
)
inline

Definition at line 48 of file BigUnsigned.hh.

48  : NumberlikeArray<Blk>(b, blen) {
49  // Eliminate any leading zeros we may have been passed.
51  }
void zapLeadingZeros()
Definition: BigUnsigned.hh:30

+ Here is the call graph for this function:

BigUnsigned::~BigUnsigned ( )
inline

Definition at line 54 of file BigUnsigned.hh.

54 {}
BigUnsigned::BigUnsigned ( unsigned long  x)

Definition at line 8 of file BigUnsigned.cc.

8 { initFromPrimitive (x); }
void initFromPrimitive(X x)
Definition: BigUnsigned.hh:356

+ Here is the call graph for this function:

BigUnsigned::BigUnsigned ( long  x)

Definition at line 11 of file BigUnsigned.cc.

void initFromSignedPrimitive(X x)
Definition: BigUnsigned.hh:373

+ Here is the call graph for this function:

BigUnsigned::BigUnsigned ( unsigned int  x)

Definition at line 9 of file BigUnsigned.cc.

9 { initFromPrimitive (x); }
void initFromPrimitive(X x)
Definition: BigUnsigned.hh:356

+ Here is the call graph for this function:

BigUnsigned::BigUnsigned ( int  x)

Definition at line 12 of file BigUnsigned.cc.

void initFromSignedPrimitive(X x)
Definition: BigUnsigned.hh:373

+ Here is the call graph for this function:

BigUnsigned::BigUnsigned ( unsigned short  x)

Definition at line 10 of file BigUnsigned.cc.

10 { initFromPrimitive (x); }
void initFromPrimitive(X x)
Definition: BigUnsigned.hh:356

+ Here is the call graph for this function:

BigUnsigned::BigUnsigned ( short  x)

Definition at line 13 of file BigUnsigned.cc.

void initFromSignedPrimitive(X x)
Definition: BigUnsigned.hh:373

+ Here is the call graph for this function:

Member Function Documentation

void BigUnsigned::add ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 124 of file BigUnsigned.cc.

124  {
125  DTRT_ALIASED(this == &a || this == &b, add(a, b));
126  // If one argument is zero, copy the other.
127  if (a.len == 0) {
128  operator =(b);
129  return;
130  } else if (b.len == 0) {
131  operator =(a);
132  return;
133  }
134  // Some variables...
135  // Carries in and out of an addition stage
136  bool carryIn, carryOut;
137  Blk temp;
138  Index i;
139  // a2 points to the longer input, b2 points to the shorter
140  const BigUnsigned *a2, *b2;
141  if (a.len >= b.len) {
142  a2 = &a;
143  b2 = &b;
144  } else {
145  a2 = &b;
146  b2 = &a;
147  }
148  // Set prelimiary length and make room in this BigUnsigned
149  len = a2->len + 1;
150  allocate(len);
151  // For each block index that is present in both inputs...
152  for (i = 0, carryIn = false; i < b2->len; i++) {
153  // Add input blocks
154  temp = a2->blk[i] + b2->blk[i];
155  // If a rollover occurred, the result is less than either input.
156  // This test is used many times in the BigUnsigned code.
157  carryOut = (temp < a2->blk[i]);
158  // If a carry was input, handle it
159  if (carryIn) {
160  temp++;
161  carryOut |= (temp == 0);
162  }
163  blk[i] = temp; // Save the addition result
164  carryIn = carryOut; // Pass the carry along
165  }
166  // If there is a carry left over, increase blocks until
167  // one does not roll over.
168  for (; i < a2->len && carryIn; i++) {
169  temp = a2->blk[i] + 1;
170  carryIn = (temp == 0);
171  blk[i] = temp;
172  }
173  // If the carry was resolved but the larger number
174  // still has blocks, copy them over.
175  for (; i < a2->len; i++)
176  blk[i] = a2->blk[i];
177  // Set the extra block if there's still a carry, decrease length otherwise
178  if (carryIn)
179  blk[i] = 1;
180  else
181  len--;
182 }
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
if(!(yy_init))
Definition: ilang_lexer.cc:846
void add(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:124
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
unsigned long Blk
Definition: BigUnsigned.hh:20
void operator=(const BigUnsigned &x)
Definition: BigUnsigned.hh:43

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void NumberlikeArray< unsigned long >::allocate ( Index  c)
inherited

+ Here is the caller graph for this function:

void NumberlikeArray< unsigned long >::allocateAndCopy ( Index  c)
inherited

+ Here is the caller graph for this function:

void BigUnsigned::bitAnd ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 544 of file BigUnsigned.cc.

544  {
545  DTRT_ALIASED(this == &a || this == &b, bitAnd(a, b));
546  // The bitwise & can't be longer than either operand.
547  len = (a.len >= b.len) ? b.len : a.len;
548  allocate(len);
549  Index i;
550  for (i = 0; i < len; i++)
551  blk[i] = a.blk[i] & b.blk[i];
552  zapLeadingZeros();
553 }
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
void bitAnd(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:544
void zapLeadingZeros()
Definition: BigUnsigned.hh:30

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

BigUnsigned::Index BigUnsigned::bitLength ( ) const

Definition at line 47 of file BigUnsigned.cc.

47  {
48  if (isZero())
49  return 0;
50  else {
51  Blk leftmostBlock = getBlock(len - 1);
52  Index leftmostBlockLen = 0;
53  while (leftmostBlock != 0) {
54  leftmostBlock >>= 1;
55  leftmostBlockLen++;
56  }
57  return leftmostBlockLen + (len - 1) * N;
58  }
59 }
bool isZero() const
Definition: BigUnsigned.hh:97
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20
Blk getBlock(Index i) const
Definition: BigUnsigned.hh:92

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::bitOr ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 555 of file BigUnsigned.cc.

555  {
556  DTRT_ALIASED(this == &a || this == &b, bitOr(a, b));
557  Index i;
558  const BigUnsigned *a2, *b2;
559  if (a.len >= b.len) {
560  a2 = &a;
561  b2 = &b;
562  } else {
563  a2 = &b;
564  b2 = &a;
565  }
566  allocate(a2->len);
567  for (i = 0; i < b2->len; i++)
568  blk[i] = a2->blk[i] | b2->blk[i];
569  for (; i < a2->len; i++)
570  blk[i] = a2->blk[i];
571  len = a2->len;
572  // Doesn't need zapLeadingZeros.
573 }
void bitOr(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:555
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::bitShiftLeft ( const BigUnsigned a,
int  b 
)

Definition at line 595 of file BigUnsigned.cc.

595  {
596  DTRT_ALIASED(this == &a, bitShiftLeft(a, b));
597  if (b < 0) {
598  if (b << 1 == 0)
599  throw "BigUnsigned::bitShiftLeft: "
600  "Pathological shift amount not implemented";
601  else {
602  bitShiftRight(a, -b);
603  return;
604  }
605  }
606  Index shiftBlocks = b / N;
607  unsigned int shiftBits = b % N;
608  // + 1: room for high bits nudged left into another block
609  len = a.len + shiftBlocks + 1;
610  allocate(len);
611  Index i, j;
612  for (i = 0; i < shiftBlocks; i++)
613  blk[i] = 0;
614  for (j = 0, i = shiftBlocks; j <= a.len; j++, i++)
615  blk[i] = getShiftedBlock(a, j, shiftBits);
616  // Zap possible leading zero
617  if (blk[len - 1] == 0)
618  len--;
619 }
friend Blk getShiftedBlock(const BigUnsigned &num, Index x, unsigned int y)
Definition: BigUnsigned.cc:293
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
void bitShiftLeft(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:595
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
void bitShiftRight(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:621

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::bitShiftRight ( const BigUnsigned a,
int  b 
)

Definition at line 621 of file BigUnsigned.cc.

621  {
622  DTRT_ALIASED(this == &a, bitShiftRight(a, b));
623  if (b < 0) {
624  if (b << 1 == 0)
625  throw "BigUnsigned::bitShiftRight: "
626  "Pathological shift amount not implemented";
627  else {
628  bitShiftLeft(a, -b);
629  return;
630  }
631  }
632  // This calculation is wacky, but expressing the shift as a left bit shift
633  // within each block lets us use getShiftedBlock.
634  Index rightShiftBlocks = (b + N - 1) / N;
635  unsigned int leftShiftBits = N * rightShiftBlocks - b;
636  // Now (N * rightShiftBlocks - leftShiftBits) == b
637  // and 0 <= leftShiftBits < N.
638  if (rightShiftBlocks >= a.len + 1) {
639  // All of a is guaranteed to be shifted off, even considering the left
640  // bit shift.
641  len = 0;
642  return;
643  }
644  // Now we're allocating a positive amount.
645  // + 1: room for high bits nudged left into another block
646  len = a.len + 1 - rightShiftBlocks;
647  allocate(len);
648  Index i, j;
649  for (j = rightShiftBlocks, i = 0; j <= a.len; j++, i++)
650  blk[i] = getShiftedBlock(a, j, leftShiftBits);
651  // Zap possible leading zero
652  if (blk[len - 1] == 0)
653  len--;
654 }
friend Blk getShiftedBlock(const BigUnsigned &num, Index x, unsigned int y)
Definition: BigUnsigned.cc:293
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
void bitShiftLeft(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:595
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
void bitShiftRight(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:621

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::bitXor ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 575 of file BigUnsigned.cc.

575  {
576  DTRT_ALIASED(this == &a || this == &b, bitXor(a, b));
577  Index i;
578  const BigUnsigned *a2, *b2;
579  if (a.len >= b.len) {
580  a2 = &a;
581  b2 = &b;
582  } else {
583  a2 = &b;
584  b2 = &a;
585  }
586  allocate(a2->len);
587  for (i = 0; i < b2->len; i++)
588  blk[i] = a2->blk[i] ^ b2->blk[i];
589  for (; i < a2->len; i++)
590  blk[i] = a2->blk[i];
591  len = a2->len;
592  zapLeadingZeros();
593 }
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
void zapLeadingZeros()
Definition: BigUnsigned.hh:30
void bitXor(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:575

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

BigUnsigned::CmpRes BigUnsigned::compareTo ( const BigUnsigned x) const

Definition at line 69 of file BigUnsigned.cc.

69  {
70  // A bigger length implies a bigger number.
71  if (len < x.len)
72  return less;
73  else if (len > x.len)
74  return greater;
75  else {
76  // Compare blocks one by one from left to right.
77  Index i = len;
78  while (i > 0) {
79  i--;
80  if (blk[i] == x.blk[i])
81  continue;
82  else if (blk[i] > x.blk[i])
83  return greater;
84  else
85  return less;
86  }
87  // If no blocks differed, the numbers are equal.
88  return equal;
89  }
90 }
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22

+ Here is the caller graph for this function:

template<class X >
X BigUnsigned::convertToPrimitive ( ) const
protected

Definition at line 387 of file BigUnsigned.hh.

387  {
388  if (len == 0)
389  // The number is zero; return zero.
390  return 0;
391  else if (len == 1) {
392  // The single block might fit in an X. Try the conversion.
393  X x = X(blk[0]);
394  // Make sure the result accurately represents the block.
395  if (Blk(x) == blk[0])
396  // Successful conversion.
397  return x;
398  // Otherwise fall through.
399  }
400  throw "BigUnsigned::to<Primitive>: "
401  "Value is too big to fit in the requested type";
402 }
#define X(_item)
unsigned long Blk
Definition: BigUnsigned.hh:20

+ Here is the caller graph for this function:

template<class X >
X BigUnsigned::convertToSignedPrimitive ( ) const
protected

Definition at line 409 of file BigUnsigned.hh.

409  {
410  X x = convertToPrimitive<X>();
411  if (x >= 0)
412  return x;
413  else
414  throw "BigUnsigned::to(Primitive): "
415  "Value is too big to fit in the requested type";
416 }
#define X(_item)
void BigUnsigned::divideWithRemainder ( const BigUnsigned b,
BigUnsigned q 
)

Definition at line 382 of file BigUnsigned.cc.

382  {
383  /* Defending against aliased calls is more complex than usual because we
384  * are writing to both *this and q.
385  *
386  * It would be silly to try to write quotient and remainder to the
387  * same variable. Rule that out right away. */
388  if (this == &q)
389  throw "BigUnsigned::divideWithRemainder: Cannot write quotient and remainder into the same variable";
390  /* Now *this and q are separate, so the only concern is that b might be
391  * aliased to one of them. If so, use a temporary copy of b. */
392  if (this == &b || &q == &b) {
393  BigUnsigned tmpB(b);
394  divideWithRemainder(tmpB, q);
395  return;
396  }
397 
398  /*
399  * Knuth's definition of mod (which this function uses) is somewhat
400  * different from the C++ definition of % in case of division by 0.
401  *
402  * We let a / 0 == 0 (it doesn't matter much) and a % 0 == a, no
403  * exceptions thrown. This allows us to preserve both Knuth's demand
404  * that a mod 0 == a and the useful property that
405  * (a / b) * b + (a % b) == a.
406  */
407  if (b.len == 0) {
408  q.len = 0;
409  return;
410  }
411 
412  /*
413  * If *this.len < b.len, then *this < b, and we can be sure that b doesn't go into
414  * *this at all. The quotient is 0 and *this is already the remainder (so leave it alone).
415  */
416  if (len < b.len) {
417  q.len = 0;
418  return;
419  }
420 
421  // At this point we know (*this).len >= b.len > 0. (Whew!)
422 
423  /*
424  * Overall method:
425  *
426  * For each appropriate i and i2, decreasing:
427  * Subtract (b << (i blocks and i2 bits)) from *this, storing the
428  * result in subtractBuf.
429  * If the subtraction succeeds with a nonnegative result:
430  * Turn on bit i2 of block i of the quotient q.
431  * Copy subtractBuf back into *this.
432  * Otherwise bit i2 of block i remains off, and *this is unchanged.
433  *
434  * Eventually q will contain the entire quotient, and *this will
435  * be left with the remainder.
436  *
437  * subtractBuf[x] corresponds to blk[x], not blk[x+i], since 2005.01.11.
438  * But on a single iteration, we don't touch the i lowest blocks of blk
439  * (and don't use those of subtractBuf) because these blocks are
440  * unaffected by the subtraction: we are subtracting
441  * (b << (i blocks and i2 bits)), which ends in at least `i' zero
442  * blocks. */
443  // Variables for the calculation
444  Index i, j, k;
445  unsigned int i2;
446  Blk temp;
447  bool borrowIn, borrowOut;
448 
449  /*
450  * Make sure we have an extra zero block just past the value.
451  *
452  * When we attempt a subtraction, we might shift `b' so
453  * its first block begins a few bits left of the dividend,
454  * and then we'll try to compare these extra bits with
455  * a nonexistent block to the left of the dividend. The
456  * extra zero block ensures sensible behavior; we need
457  * an extra block in `subtractBuf' for exactly the same reason.
458  */
459  Index origLen = len; // Save real length.
460  /* To avoid an out-of-bounds access in case of reallocation, allocate
461  * first and then increment the logical length. */
462  allocateAndCopy(len + 1);
463  len++;
464  blk[origLen] = 0; // Zero the added block.
465 
466  // subtractBuf holds part of the result of a subtraction; see above.
467  Blk *subtractBuf = new Blk[len];
468 
469  // Set preliminary length for quotient and make room
470  q.len = origLen - b.len + 1;
471  q.allocate(q.len);
472  // Zero out the quotient
473  for (i = 0; i < q.len; i++)
474  q.blk[i] = 0;
475 
476  // For each possible left-shift of b in blocks...
477  i = q.len;
478  while (i > 0) {
479  i--;
480  // For each possible left-shift of b in bits...
481  // (Remember, N is the number of bits in a Blk.)
482  q.blk[i] = 0;
483  i2 = N;
484  while (i2 > 0) {
485  i2--;
486  /*
487  * Subtract b, shifted left i blocks and i2 bits, from *this,
488  * and store the answer in subtractBuf. In the for loop, `k == i + j'.
489  *
490  * Compare this to the middle section of `multiply'. They
491  * are in many ways analogous. See especially the discussion
492  * of `getShiftedBlock'.
493  */
494  for (j = 0, k = i, borrowIn = false; j <= b.len; j++, k++) {
495  temp = blk[k] - getShiftedBlock(b, j, i2);
496  borrowOut = (temp > blk[k]);
497  if (borrowIn) {
498  borrowOut |= (temp == 0);
499  temp--;
500  }
501  // Since 2005.01.11, indices of `subtractBuf' directly match those of `blk', so use `k'.
502  subtractBuf[k] = temp;
503  borrowIn = borrowOut;
504  }
505  // No more extra iteration to deal with `bHigh'.
506  // Roll-over a borrow as necessary.
507  for (; k < origLen && borrowIn; k++) {
508  borrowIn = (blk[k] == 0);
509  subtractBuf[k] = blk[k] - 1;
510  }
511  /*
512  * If the subtraction was performed successfully (!borrowIn),
513  * set bit i2 in block i of the quotient.
514  *
515  * Then, copy the portion of subtractBuf filled by the subtraction
516  * back to *this. This portion starts with block i and ends--
517  * where? Not necessarily at block `i + b.len'! Well, we
518  * increased k every time we saved a block into subtractBuf, so
519  * the region of subtractBuf we copy is just [i, k).
520  */
521  if (!borrowIn) {
522  q.blk[i] |= (Blk(1) << i2);
523  while (k > i) {
524  k--;
525  blk[k] = subtractBuf[k];
526  }
527  }
528  }
529  }
530  // Zap possible leading zero in quotient
531  if (q.blk[q.len - 1] == 0)
532  q.len--;
533  // Zap any/all leading zeros in remainder
534  zapLeadingZeros();
535  // Deallocate subtractBuf.
536  // (Thanks to Brad Spencer for noticing my accidental omission of this!)
537  delete [] subtractBuf;
538 }
void allocate(Index c)
friend Blk getShiftedBlock(const BigUnsigned &num, Index x, unsigned int y)
Definition: BigUnsigned.cc:293
void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q)
Definition: BigUnsigned.cc:382
while(1)
Definition: ilang_lexer.cc:872
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20
void zapLeadingZeros()
Definition: BigUnsigned.hh:30

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool BigUnsigned::getBit ( Index  bi) const
inline

Definition at line 105 of file BigUnsigned.hh.

105  {
106  return (getBlock(bi / N) & (Blk(1) << (bi % N))) != 0;
107  }
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20
Blk getBlock(Index i) const
Definition: BigUnsigned.hh:92

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Blk BigUnsigned::getBlock ( Index  i) const
inline

Definition at line 92 of file BigUnsigned.hh.

92 { return i >= len ? 0 : blk[i]; }

+ Here is the caller graph for this function:

Index NumberlikeArray< unsigned long >::getCapacity ( ) const
inlineinherited

Definition at line 72 of file NumberlikeArray.hh.

Index NumberlikeArray< unsigned long >::getLength ( ) const
inlineinherited

Definition at line 73 of file NumberlikeArray.hh.

template<class X >
void BigUnsigned::initFromPrimitive ( X  x)
protected

Definition at line 356 of file BigUnsigned.hh.

356  {
357  if (x == 0)
358  ; // NumberlikeArray already initialized us to zero.
359  else {
360  // Create a single block. blk is NULL; no need to delete it.
361  cap = 1;
362  blk = new Blk[1];
363  len = 1;
364  blk[0] = Blk(x);
365  }
366 }
unsigned long Blk
Definition: BigUnsigned.hh:20

+ Here is the caller graph for this function:

template<class X >
void BigUnsigned::initFromSignedPrimitive ( X  x)
protected

Definition at line 373 of file BigUnsigned.hh.

373  {
374  if (x < 0)
375  throw "BigUnsigned constructor: "
376  "Cannot construct a BigUnsigned from a negative number";
377  else
379 }
void initFromPrimitive(X x)
Definition: BigUnsigned.hh:356

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool NumberlikeArray< unsigned long >::isEmpty ( ) const
inlineinherited

Definition at line 75 of file NumberlikeArray.hh.

75 { return len == 0; }
bool BigUnsigned::isZero ( ) const
inline

Definition at line 97 of file BigUnsigned.hh.

bool isEmpty() const

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::multiply ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 300 of file BigUnsigned.cc.

300  {
301  DTRT_ALIASED(this == &a || this == &b, multiply(a, b));
302  // If either a or b is zero, set to zero.
303  if (a.len == 0 || b.len == 0) {
304  len = 0;
305  return;
306  }
307  /*
308  * Overall method:
309  *
310  * Set this = 0.
311  * For each 1-bit of `a' (say the `i2'th bit of block `i'):
312  * Add `b << (i blocks and i2 bits)' to *this.
313  */
314  // Variables for the calculation
315  Index i, j, k;
316  unsigned int i2;
317  Blk temp;
318  bool carryIn, carryOut;
319  // Set preliminary length and make room
320  len = a.len + b.len;
321  allocate(len);
322  // Zero out this object
323  for (i = 0; i < len; i++)
324  blk[i] = 0;
325  // For each block of the first number...
326  for (i = 0; i < a.len; i++) {
327  // For each 1-bit of that block...
328  for (i2 = 0; i2 < N; i2++) {
329  if ((a.blk[i] & (Blk(1) << i2)) == 0)
330  continue;
331  /*
332  * Add b to this, shifted left i blocks and i2 bits.
333  * j is the index in b, and k = i + j is the index in this.
334  *
335  * `getShiftedBlock', a short inline function defined above,
336  * is now used for the bit handling. It replaces the more
337  * complex `bHigh' code, in which each run of the loop dealt
338  * immediately with the low bits and saved the high bits to
339  * be picked up next time. The last run of the loop used to
340  * leave leftover high bits, which were handled separately.
341  * Instead, this loop runs an additional time with j == b.len.
342  * These changes were made on 2005.01.11.
343  */
344  for (j = 0, k = i, carryIn = false; j <= b.len; j++, k++) {
345  /*
346  * The body of this loop is very similar to the body of the first loop
347  * in `add', except that this loop does a `+=' instead of a `+'.
348  */
349  temp = blk[k] + getShiftedBlock(b, j, i2);
350  carryOut = (temp < blk[k]);
351  if (carryIn) {
352  temp++;
353  carryOut |= (temp == 0);
354  }
355  blk[k] = temp;
356  carryIn = carryOut;
357  }
358  // No more extra iteration to deal with `bHigh'.
359  // Roll-over a carry as necessary.
360  for (; carryIn; k++) {
361  blk[k]++;
362  carryIn = (blk[k] == 0);
363  }
364  }
365  }
366  // Zap possible leading zero
367  if (blk[len - 1] == 0)
368  len--;
369 }
friend Blk getShiftedBlock(const BigUnsigned &num, Index x, unsigned int y)
Definition: BigUnsigned.cc:293
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20
void multiply(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:300

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool NumberlikeArray< unsigned long >::operator!= ( const NumberlikeArray< unsigned long > &  x) const
inlineinherited

Definition at line 82 of file NumberlikeArray.hh.

82  {
83  return !operator ==(x);
84  }
bool operator==(const NumberlikeArray< unsigned long > &x) const
bool BigUnsigned::operator!= ( const BigUnsigned x) const
inline

Definition at line 121 of file BigUnsigned.hh.

121  {
123  }
bool operator!=(const NumberlikeArray< Blk > &x) const

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator% ( const BigUnsigned x) const
inline

Definition at line 269 of file BigUnsigned.hh.

269  {
270  if (x.isZero()) throw "BigUnsigned::operator %: division by zero";
271  BigUnsigned q, r;
272  r = *this;
273  r.divideWithRemainder(x, q);
274  return r;
275 }
void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q)
Definition: BigUnsigned.cc:382
bool isZero() const
Definition: BigUnsigned.hh:97

+ Here is the call graph for this function:

void BigUnsigned::operator%= ( const BigUnsigned x)
inline

Definition at line 320 of file BigUnsigned.hh.

320  {
321  if (x.isZero()) throw "BigUnsigned::operator %=: division by zero";
322  BigUnsigned q;
323  // Mods *this by x. Don't care about quotient left in q.
324  divideWithRemainder(x, q);
325 }
void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q)
Definition: BigUnsigned.cc:382
bool isZero() const
Definition: BigUnsigned.hh:97

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator& ( const BigUnsigned x) const
inline

Definition at line 276 of file BigUnsigned.hh.

276  {
277  BigUnsigned ans;
278  ans.bitAnd(*this, x);
279  return ans;
280 }
void bitAnd(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:544

+ Here is the call graph for this function:

void BigUnsigned::operator&= ( const BigUnsigned x)
inline

Definition at line 326 of file BigUnsigned.hh.

326  {
327  bitAnd(*this, x);
328 }
void bitAnd(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:544

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator* ( const BigUnsigned x) const
inline

Definition at line 257 of file BigUnsigned.hh.

257  {
258  BigUnsigned ans;
259  ans.multiply(*this, x);
260  return ans;
261 }
void multiply(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:300

+ Here is the call graph for this function:

void BigUnsigned::operator*= ( const BigUnsigned x)
inline

Definition at line 308 of file BigUnsigned.hh.

308  {
309  multiply(*this, x);
310 }
void multiply(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:300

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator+ ( const BigUnsigned x) const
inline

Definition at line 247 of file BigUnsigned.hh.

247  {
248  BigUnsigned ans;
249  ans.add(*this, x);
250  return ans;
251 }
void add(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:124

+ Here is the call graph for this function:

void BigUnsigned::operator++ ( )

Definition at line 659 of file BigUnsigned.cc.

659  {
660  Index i;
661  bool carry = true;
662  for (i = 0; i < len && carry; i++) {
663  blk[i]++;
664  carry = (blk[i] == 0);
665  }
666  if (carry) {
667  // Allocate and then increase length, as in divideWithRemainder
668  allocateAndCopy(len + 1);
669  len++;
670  blk[i] = 1;
671  }
672 }
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::operator++ ( int  )

Definition at line 675 of file BigUnsigned.cc.

675  {
676  operator ++();
677 }
void operator++()
Definition: BigUnsigned.cc:659

+ Here is the call graph for this function:

void BigUnsigned::operator+= ( const BigUnsigned x)
inline

Definition at line 302 of file BigUnsigned.hh.

302  {
303  add(*this, x);
304 }
void add(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:124

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator- ( const BigUnsigned x) const
inline

Definition at line 252 of file BigUnsigned.hh.

252  {
253  BigUnsigned ans;
254  ans.subtract(*this, x);
255  return ans;
256 }
void subtract(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:184

+ Here is the call graph for this function:

void BigUnsigned::operator-- ( )

Definition at line 680 of file BigUnsigned.cc.

680  {
681  if (len == 0)
682  throw "BigUnsigned::operator --(): Cannot decrement an unsigned zero";
683  Index i;
684  bool borrow = true;
685  for (i = 0; borrow; i++) {
686  borrow = (blk[i] == 0);
687  blk[i]--;
688  }
689  // Zap possible leading zero (there can only be one)
690  if (blk[len - 1] == 0)
691  len--;
692 }
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22

+ Here is the caller graph for this function:

void BigUnsigned::operator-- ( int  )

Definition at line 695 of file BigUnsigned.cc.

695  {
696  operator --();
697 }
void operator--()
Definition: BigUnsigned.cc:680

+ Here is the call graph for this function:

void BigUnsigned::operator-= ( const BigUnsigned x)
inline

Definition at line 305 of file BigUnsigned.hh.

305  {
306  subtract(*this, x);
307 }
void subtract(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:184

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator/ ( const BigUnsigned x) const
inline

Definition at line 262 of file BigUnsigned.hh.

262  {
263  if (x.isZero()) throw "BigUnsigned::operator /: division by zero";
264  BigUnsigned q, r;
265  r = *this;
266  r.divideWithRemainder(x, q);
267  return q;
268 }
void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q)
Definition: BigUnsigned.cc:382
bool isZero() const
Definition: BigUnsigned.hh:97

+ Here is the call graph for this function:

void BigUnsigned::operator/= ( const BigUnsigned x)
inline

Definition at line 311 of file BigUnsigned.hh.

311  {
312  if (x.isZero()) throw "BigUnsigned::operator /=: division by zero";
313  /* The following technique is slightly faster than copying *this first
314  * when x is large. */
315  BigUnsigned q;
316  divideWithRemainder(x, q);
317  // *this contains the remainder, but we overwrite it with the quotient.
318  *this = q;
319 }
void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q)
Definition: BigUnsigned.cc:382
bool isZero() const
Definition: BigUnsigned.hh:97

+ Here is the call graph for this function:

bool BigUnsigned::operator< ( const BigUnsigned x) const
inline

Definition at line 124 of file BigUnsigned.hh.

124 { return compareTo(x) == less ; }
CmpRes compareTo(const BigUnsigned &x) const
Definition: BigUnsigned.cc:69

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator<< ( int  b) const
inline

Definition at line 291 of file BigUnsigned.hh.

291  {
292  BigUnsigned ans;
293  ans.bitShiftLeft(*this, b);
294  return ans;
295 }
void bitShiftLeft(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:595

+ Here is the call graph for this function:

void BigUnsigned::operator<<= ( int  b)
inline

Definition at line 335 of file BigUnsigned.hh.

335  {
336  bitShiftLeft(*this, b);
337 }
void bitShiftLeft(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:595

+ Here is the call graph for this function:

bool BigUnsigned::operator<= ( const BigUnsigned x) const
inline

Definition at line 125 of file BigUnsigned.hh.

125 { return compareTo(x) != greater; }
CmpRes compareTo(const BigUnsigned &x) const
Definition: BigUnsigned.cc:69

+ Here is the call graph for this function:

void BigUnsigned::operator= ( const BigUnsigned x)
inline

Definition at line 43 of file BigUnsigned.hh.

43  {
45  }
void operator=(const NumberlikeArray< Blk > &x)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool NumberlikeArray< unsigned long >::operator== ( const NumberlikeArray< unsigned long > &  x) const
inherited
bool BigUnsigned::operator== ( const BigUnsigned x) const
inline

Definition at line 118 of file BigUnsigned.hh.

118  {
120  }
bool operator==(const NumberlikeArray< Blk > &x) const

+ Here is the call graph for this function:

bool BigUnsigned::operator> ( const BigUnsigned x) const
inline

Definition at line 127 of file BigUnsigned.hh.

127 { return compareTo(x) == greater; }
CmpRes compareTo(const BigUnsigned &x) const
Definition: BigUnsigned.cc:69

+ Here is the call graph for this function:

bool BigUnsigned::operator>= ( const BigUnsigned x) const
inline

Definition at line 126 of file BigUnsigned.hh.

126 { return compareTo(x) != less ; }
CmpRes compareTo(const BigUnsigned &x) const
Definition: BigUnsigned.cc:69

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator>> ( int  b) const
inline

Definition at line 296 of file BigUnsigned.hh.

296  {
297  BigUnsigned ans;
298  ans.bitShiftRight(*this, b);
299  return ans;
300 }
void bitShiftRight(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:621

+ Here is the call graph for this function:

void BigUnsigned::operator>>= ( int  b)
inline

Definition at line 338 of file BigUnsigned.hh.

338  {
339  bitShiftRight(*this, b);
340 }
void bitShiftRight(const BigUnsigned &a, int b)
Definition: BigUnsigned.cc:621

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator^ ( const BigUnsigned x) const
inline

Definition at line 286 of file BigUnsigned.hh.

286  {
287  BigUnsigned ans;
288  ans.bitXor(*this, x);
289  return ans;
290 }
void bitXor(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:575

+ Here is the call graph for this function:

void BigUnsigned::operator^= ( const BigUnsigned x)
inline

Definition at line 332 of file BigUnsigned.hh.

332  {
333  bitXor(*this, x);
334 }
void bitXor(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:575

+ Here is the call graph for this function:

BigUnsigned BigUnsigned::operator| ( const BigUnsigned x) const
inline

Definition at line 281 of file BigUnsigned.hh.

281  {
282  BigUnsigned ans;
283  ans.bitOr(*this, x);
284  return ans;
285 }
void bitOr(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:555

+ Here is the call graph for this function:

void BigUnsigned::operator|= ( const BigUnsigned x)
inline

Definition at line 329 of file BigUnsigned.hh.

329  {
330  bitOr(*this, x);
331 }
void bitOr(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:555

+ Here is the call graph for this function:

void BigUnsigned::setBit ( Index  bi,
bool  newBit 
)

Definition at line 61 of file BigUnsigned.cc.

61  {
62  Index blockI = bi / N;
63  Blk block = getBlock(blockI), mask = Blk(1) << (bi % N);
64  block = newBit ? (block | mask) : (block & ~mask);
65  setBlock(blockI, block);
66 }
void setBlock(Index i, Blk newBlock)
Definition: BigUnsigned.cc:24
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20
Blk getBlock(Index i) const
Definition: BigUnsigned.hh:92

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::setBlock ( Index  i,
Blk  newBlock 
)

Definition at line 24 of file BigUnsigned.cc.

24  {
25  if (newBlock == 0) {
26  if (i < len) {
27  blk[i] = 0;
29  }
30  // If i >= len, no effect.
31  } else {
32  if (i >= len) {
33  // The nonzero block extends the number.
34  allocateAndCopy(i+1);
35  // Zero any added blocks that we aren't setting.
36  for (Index j = len; j < i; j++)
37  blk[j] = 0;
38  len = i+1;
39  }
40  blk[i] = newBlock;
41  }
42 }
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
void zapLeadingZeros()
Definition: BigUnsigned.hh:30

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void BigUnsigned::subtract ( const BigUnsigned a,
const BigUnsigned b 
)

Definition at line 184 of file BigUnsigned.cc.

184  {
185  DTRT_ALIASED(this == &a || this == &b, subtract(a, b));
186  if (b.len == 0) {
187  // If b is zero, copy a.
188  operator =(a);
189  return;
190  } else if (a.len < b.len)
191  // If a is shorter than b, the result is negative.
192  throw "BigUnsigned::subtract: "
193  "Negative result in unsigned calculation";
194  // Some variables...
195  bool borrowIn, borrowOut;
196  Blk temp;
197  Index i;
198  // Set preliminary length and make room
199  len = a.len;
200  allocate(len);
201  // For each block index that is present in both inputs...
202  for (i = 0, borrowIn = false; i < b.len; i++) {
203  temp = a.blk[i] - b.blk[i];
204  // If a reverse rollover occurred,
205  // the result is greater than the block from a.
206  borrowOut = (temp > a.blk[i]);
207  // Handle an incoming borrow
208  if (borrowIn) {
209  borrowOut |= (temp == 0);
210  temp--;
211  }
212  blk[i] = temp; // Save the subtraction result
213  borrowIn = borrowOut; // Pass the borrow along
214  }
215  // If there is a borrow left over, decrease blocks until
216  // one does not reverse rollover.
217  for (; i < a.len && borrowIn; i++) {
218  borrowIn = (a.blk[i] == 0);
219  blk[i] = a.blk[i] - 1;
220  }
221  /* If there's still a borrow, the result is negative.
222  * Throw an exception, but zero out this object so as to leave it in a
223  * predictable state. */
224  if (borrowIn) {
225  len = 0;
226  throw "BigUnsigned::subtract: Negative result in unsigned calculation";
227  } else
228  // Copy over the rest of the blocks
229  for (; i < a.len; i++)
230  blk[i] = a.blk[i];
231  // Zap leading zeros
232  zapLeadingZeros();
233 }
#define DTRT_ALIASED(cond, op)
Definition: BigUnsigned.cc:114
void subtract(const BigUnsigned &a, const BigUnsigned &b)
Definition: BigUnsigned.cc:184
NumberlikeArray< Blk >::Index Index
Definition: BigUnsigned.hh:22
unsigned long Blk
Definition: BigUnsigned.hh:20
void operator=(const BigUnsigned &x)
Definition: BigUnsigned.hh:43
void zapLeadingZeros()
Definition: BigUnsigned.hh:30

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int BigUnsigned::toInt ( ) const

Definition at line 19 of file BigUnsigned.cc.

19 { return convertToSignedPrimitive< int >(); }
long BigUnsigned::toLong ( ) const

Definition at line 18 of file BigUnsigned.cc.

18 { return convertToSignedPrimitive< long >(); }
short BigUnsigned::toShort ( ) const

Definition at line 20 of file BigUnsigned.cc.

20 { return convertToSignedPrimitive< short>(); }
unsigned int BigUnsigned::toUnsignedInt ( ) const

Definition at line 16 of file BigUnsigned.cc.

16 { return convertToPrimitive <unsigned int >(); }
unsigned long BigUnsigned::toUnsignedLong ( ) const

Definition at line 15 of file BigUnsigned.cc.

15 { return convertToPrimitive <unsigned long >(); }
unsigned short BigUnsigned::toUnsignedShort ( ) const

Definition at line 17 of file BigUnsigned.cc.

17 { return convertToPrimitive <unsigned short>(); }

+ Here is the caller graph for this function:

void BigUnsigned::zapLeadingZeros ( )
inlineprotected

Definition at line 30 of file BigUnsigned.hh.

30  {
31  while (len > 0 && blk[len - 1] == 0)
32  len--;
33  }

+ Here is the caller graph for this function:

Friends And Related Function Documentation

template<class X >
X convertBigUnsignedToPrimitiveAccess ( const BigUnsigned a)
friend

Definition at line 88 of file BigInteger.cc.

88  {
89  return a.convertToPrimitive<X>();
90 }
X convertToPrimitive() const
Definition: BigUnsigned.hh:387
#define X(_item)
Blk getShiftedBlock ( const BigUnsigned num,
BigUnsigned::Index  x,
unsigned int  y 
)
friend

Definition at line 293 of file BigUnsigned.cc.

294  {
295  BigUnsigned::Blk part1 = (x == 0 || y == 0) ? 0 : (num.blk[x - 1] >> (BigUnsigned::N - y));
296  BigUnsigned::Blk part2 = (x == num.len) ? 0 : (num.blk[x] << y);
297  return part1 | part2;
298 }
static const unsigned int N
unsigned long Blk
Definition: BigUnsigned.hh:20

Field Documentation

unsigned long * NumberlikeArray< unsigned long >::blk
inherited

Definition at line 34 of file NumberlikeArray.hh.

Index NumberlikeArray< unsigned long >::cap
inherited

Definition at line 30 of file NumberlikeArray.hh.

Index NumberlikeArray< unsigned long >::len
inherited

Definition at line 32 of file NumberlikeArray.hh.

const unsigned int NumberlikeArray< unsigned long >::N
staticinherited

Definition at line 27 of file NumberlikeArray.hh.


The documentation for this class was generated from the following files: