• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 387
  • Last Modified:

BigInteger doesn't support >>>

I have a large number. I need to grab the number represented by the first 21 bits. I do this by doing:
    (number & 0xFFFFF8000L) >>> 15;
That works in java because the number is of type long which is 64 bits. However, in javascript I have found that the bitwise operators truncate values down to 32 bits. So, to get around this I found a javascript implementation of the Java class BigInteger. It is at:
I can do the mask using the and() method. But, I don't know how to do the shift. The javascript implementation, like the Java implementation of BigInteger, does not support unsigned bitwise shifts.

I can do this:

var origEncodedVal = 26766802693;
var encodedVal = new BigInteger(""+origEncodedVal, 10);
var mask = new BigInteger("FFFFF8000",16);
var result = encodedVal.and(mask).shiftRight(15);

but won't the final result be wrong if the initial bit is set in the original encoded value? I'm not worried about other masks on that number like 0x000007F00 because the high bit will be 0 regardless, so a signed shift and unsigned shift do the same thing in that case..

How do I deal with this? Why does BigInteger not implement unsigned shift right? The javadoc of BigInteger says:
    "The unsigned right shift operator (>>>) is omitted, as this operation makes little sense in combination with the "infinite word size" abstraction provided by this class."
but that statement doesn't make any sense to me.

I suppose one solution would be to shift right one bit and then AND it with a mask that zeroes out the high bit. Is that my best bet or is there a better way to do it? Another solution I suppose would be to prefix the original number with "0" and adjust the masks accordingly. It just seems silly that I would need to do that though.
1 Solution
Tommy BraasCommented:
If you need to right shift, just divide by 2 the number of times you want ot shift.
BigInteger has no defined word size, so its not a problem as the virtual sign bit won't be affected.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now