Search code examples
javabigintegerjscience

LargeInteger's equivalent of BigInteger's testBit?


Does LargeInteger have an equivalent to BigInteger's testBit?

If not, how can testBit be performed on a LargeInteger?

I don't yet have the necessary skills to reproduce ((this & (1<<n)) != 0).


I tried making a method by just copying & pasting the above code referenced from the docs:

static boolean testBit(int n){
    return ((this & (1<<n)) != 0);
}

However, the compiler reports:

error: non-static variable this cannot be referenced from a static context
    return ((this & (1<<n)) != 0);
             ^
error: bad operand types for binary operator '&'
    return ((this & (1<<n)) != 0);
                  ^

Solution

  • This is the best I can come up with given the API:

    static boolean testBit(LargeInteger i, int n) {
        return i.shiftRight(n).isOdd();
    }
    

    n is the position of the bit to be tested.

    I assume you put this method in some utility class.

    Explanation

    Normally, you would do num & (1 << pos) to extract the bit at pos position:

    ???????x?????
    0000000100000
    -------------
    0000000x00000
    

    If the whole thing is 0 then x is 0; otherwise, x is 1.


    In the method above, I do num >> pos:

    ???????x?????
    -------------
    ????????????x
    

    We know that a binary number is odd when its least significant bit is 1, and it is even when its least significant bit is 0.

    So if the number after right-shifting is odd, we know the bit is 1; if even, we know the bit is 0.