Search code examples
javabinarybigintegerjscience

LargeInteger's equivalent of BigInteger's and?


LargeInteger doesn't appear to have an equivalent function to BigInteger's and.

Since and(BigInteger val) "Returns a BigInteger whose value is (this & val). (This method returns a negative BigInteger if and only if this and val are both negative.)", I tried to follow this great answer on reproducing testBit with

static LargeInteger and(LargeInteger i, LargeInteger j) {
    return i & j;
}

but the compiler reports

error: bad operand types for binary operator '&'
    return i & j;
             ^

How can BigInteger's and be reproduced to be used on LargeInteger?


Solution

  • org.jscience.mathematics.number.LargeInteger does not seem to have a similar bit-wise function and (if I have sougth the right class & version).

    static LargeInteger and(LargeInteger lhs, LargeInteger rhs) {
         long l = lhs.longValue(); // Low order bits
         long r = rhs.longValue();
         long lo = l & r;
    
         LargeInteger hi = LargeInteger.ZERO;
         if (lhs.bitLength() > 64 && rhs.bitLength() > 64) {
             hi = and(lhs.shiftRight(64), rhs.shiftRight(64)).shiftLeft(64);
         }
         return hi.plus(lo);
    }
    

    Mind, that for a bitwise or the condition needs || instead of &&.