Javascript Bitwise Operators

Friday, 15 May 2009 12:00pm

I stumbled across an interesting "edge" case in Javascript when porting gfx to Javascript.

Turns out Javascript converts numbers to 32-bit signed numbers before evaluating bitwise operators. This is problematic because it prevents you from using the msb for 32-bit bitmaks:

Java:        0xaabbcc | 0xff000000 = 0xffaabbcc (4289379276)
Javascript:  0xaabbcc | 0xff000000 = 0xffabbcc  (-554434)

The workaround is pretty straightforward, you simply have to add 2^32+1 to convert back to an "unsigned" value:

var x = 0xaabbcc | 0xff000000;
if (x < 0) x += 0xffffffff+1;

But unfortunately, that means I have to wrap all bitwise operations in a method call, and perform that check, which I expect will not be anywhere near as fast as the straight operator call.