I have 2 numbers in javascript that I want to bit and. They both are 33bit long
in C#:
((4294967296 & 4294967296 )==0) is false
but in javascript:
((4294967296 & 4294967296 )==0) is true
4294967296 is ((long)1) << 32
As I understand it, it is due to the fact that javascript converts values to int32 when performing bit wise operations.
How do I work around this? Any suggestions on how to replace bit and with a set of other math operations so that bits are not lost?
The bitwise XOR operator ( ^ ) returns a 1 in each bit position for which the corresponding bits of either but not both operands are 1 s.
Description. This operator shifts the first operand the specified number of bits to the right. Excess bits shifted off to the right are discarded. Copies of the leftmost bit are shifted in from the left.
4) What is the result of 0110 & 1100.? Explanation: Bitwise & operator gives 1 if both operands are 1. 1&1 = 1.
Here's a fun function for arbitrarily large integers:
function BitwiseAndLarge(val1, val2) { var shift = 0, result = 0; var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones) var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time while( (val1 != 0) && (val2 != 0) ) { var rs = (mask & val1) & (mask & val2); val1 = Math.floor(val1 / divisor); // val1 >>> 30 val2 = Math.floor(val2 / divisor); // val2 >>> 30 for(var i = shift++; i--;) { rs *= divisor; // rs << 30 } result += rs; } return result; }
Assuming that the system handles at least 30-bit bitwise operations properly.
You could split each of the vars into 2 32-bit values (like a high word and low word), then do a bitwise operation on both pairs.
The script below runs as a Windows .js script. You can replace WScript.Echo() with alert() for Web.
var a = 4294967296; var b = 4294967296; var w = 4294967296; // 2^32 var aHI = a / w; var aLO = a % w; var bHI = b / w; var bLO = b % w; WScript.Echo((aHI & bHI) * w + (aLO & bLO));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With