I want to split a 64bit integer into two 32bit integers:
var bigInt = 0xffffff;
var highInt = bigInt >> 8 // get the high bits 0xfff
var lowInt = bigI
In JavaScript all numbers are represented using 53 bits. JavaScript uses floating point representation to store all numbers internally, which means that integers are stored as floating point numbers (mantissa has 53 bits)
So with 53 bits we can represent max 2^53 = 9007199254740992.
But you cannot use right shift and AND binary operations to extract lower 32 bits and higher 21 bits even from 53 bit numbers.
The reason is when we apply binary operator on any number - Javascript first convert that number to 32 bit signed number, apply the binary operation and return the result. This means any bit that sits in position higher than 32 will be discarded.
I have used following approach to extract the higher (21 bit) and lower (32 bits) portions from a positive number <= 2^53.
var bigNumber = Math.pow(2, 53); // 9007199254740992
var bigNumberAsBinaryStr = bigNumber.toString(2); // '100000000000000000000000000000000000000000000000000000'
// Convert the above binary str to 64 bit (actually 52 bit will work) by padding zeros in the left
var bigNumberAsBinaryStr2 = '';
for (var i = 0; i < 64 - bigNumberAsBinaryStr.length; i++) {
bigNumberAsBinaryStr2 += '0';
};
bigNumberAsBinaryStr2 += bigNumberAsBinaryStr;
var lowInt = parseInt(bigNumberAsBinaryStr2.substring(0, 32), 2);
var highInt = parseInt(bigNumberAsBinaryStr2.substring(32), 2);
Just to confirm above logic is correct, lets try building the bigNumber from two parts
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);