- Improve comments for the new BigUnsigned accessors.
[bigint/bigint.git] / BigUnsigned.hh
index 0813234..683ac8b 100644 (file)
@@ -81,7 +81,7 @@ protected:
        template <class X> X convertToPrimitive      () const;
 public:
 
-       // ACCESSORS
+       // BIT/BLOCK ACCESSORS
 
        // Expose these from NumberlikeArray directly.
        NumberlikeArray<Blk>::getCapacity;
@@ -90,10 +90,25 @@ public:
        /* Returns the requested block, or 0 if it is beyond the length (as if
         * the number had 0s infinitely to the left). */
        Blk getBlock(Index i) const { return i >= len ? 0 : blk[i]; }
+       /* Sets the requested block.  The number grows or shrinks as necessary. */
+       void setBlock(Index i, Blk newBlock);
 
        // The number is zero if and only if the canonical length is zero.
        bool isZero() const { return NumberlikeArray<Blk>::isEmpty(); }
 
+       /* Returns the length of the number in bits, i.e., zero if the number
+        * is zero and otherwise one more than the largest value of bi for
+        * which getBit(bi) returns true. */
+       Index bitLength() const;
+       /* Get the state of bit bi, which has value 2^bi.  Bits beyond the
+        * number's length are considered to be 0. */
+       bool getBit(Index bi) const {
+               return (getBlock(bi / N) & (1 << (bi % N))) != 0;
+       }
+       /* Sets the state of bit bi to newBit.  The number grows or shrinks as
+        * necessary. */
+       void setBit(Index bi, bool newBit);
+
        // COMPARISONS
 
        // Compares this to x like Perl's <=>
@@ -326,7 +341,7 @@ inline void BigUnsigned::operator >>=(int b) {
 
 /* Templates for conversions of BigUnsigned to and from primitive integers.
  * BigInteger.cc needs to instantiate convertToPrimitive, and the uses in
- * BigUnsigned.cc didn't do the trick; I think gcc inlined convertToPrimitive
+ * BigUnsigned.cc didn't do the trick; I think g++ inlined convertToPrimitive
  * instead of generating linkable instantiations.  So for consistency, I put
  * all the templates here. */