Reputation: 1050
How can I emulate 32bit unsiged integers without any external dependencies in Javascript? Tricks with x >>> 0
or x | 0
don't work (for multiplication, they seem to work for addition / subtraction), and doubles lose precision during multiplication.
For example, try to multiply 2654435769 * 340573321 (mod 2^32). The result should be 1.
This answer has multiplication. What about addition / subtraction / division?
Here's a link to wolfram alpha, presenting the equation above.
Upvotes: 9
Views: 9237
Reputation: 1885
You can ape it with BigInts in 2020.
const u32mul = (x, y) => Number((BigInt(x) * BigInt(y)) & 0xFFFFFFFFn);
A sufficiently smart compiler should work this out, but I haven't benchmarked this, so proceed with caution.
The other alternative would of course drop into WebAssembly. If you need to be working at this level, I'd strongly advise it.
Upvotes: 1
Reputation: 204718
A 32-bit unsigned int fits within Javascript's 64-bit float -- there should be no loss of precision when performing addition, subtraction, or division. Just mask with 0xffffffff
to stay within a 32-bit integer. Multiplication goes beyond what fits, but you already have a solution for that.
Upvotes: 3