LargeInteger's equivalent of BigInteger's testBit?

298 views Asked by At

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);
                  ^
1

There are 1 answers

2
nhahtdh On BEST ANSWER

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.