+
+ /*
+ * BigUnsigned and BigInteger both provide three kinds of operators.
+ * Here ``big-integer'' refers to BigInteger or BigUnsigned.
+ *
+ * (1) Overloaded ``return-by-value'' operators:
+ * +, -, *, /, %, unary -.
+ * Big-integer code using these operators looks identical to
+ * code using the primitive integer types. These operators take
+ * one or two big-integer inputs and return a big-integer result,
+ * which can then be assigned to a BigInteger variable or used
+ * in an expression. Example:
+ * BigInteger a(1), b = 1;
+ * BigInteger c = a + b;
+ *
+ * (2) Overloaded assignment operators:
+ * +=, -=, *=, /=, %=, &=, |=, ^=, ++, --, flipSign.
+ * Again, these are used on big integers just like on ints.
+ * They take one writable big integer that both provides an
+ * operand and receives a result. The first eight also take
+ * a second read-only operand. Example:
+ * BigInteger a(1), b(1);
+ * a += b;
+ *
+ * (3) ``Put-here'' operations: `add', `subtract', etc.
+ * Using a return-by-value or assignment operator generally involves
+ * copy constructions and/or assignments. The ``put-here'' operations
+ * require none, but they are more of a hassle to use. Most take two
+ * read-only operands and save the result in the calling object `*this',
+ * whose previous value is ignored. `divideWithRemainder' is an exception.
+ * <<< NOTE >>>: Put-here operations do not return a value: they don't need to!!
+ * Examples:
+ * BigInteger a(43), b(7), c, d;
+ * c = a + b; // Now c == 50.
+ * c.add(a, b); // Same effect but without the two bulk-copies.
+ * c.divideWithRemainder(b, d); // 50 / 7; now d == 7 (quotient) and c == 1 (remainder).
+ * a.add(a, b); // Unsafe ``aliased'' call; causes a runtime error.
+ */