Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do bitwise AND in javascript on variables that are longer than 32 bit?

Tags:

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?

like image 647
Oleg D. Avatar asked Sep 03 '10 16:09

Oleg D.


People also ask

What is bitwise XOR operator in Javascript?

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.

Can you bit shift in Javascript?

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.

What is the output of bitwise OR operation on 0110 and 1100?

4) What is the result of 0110 & 1100.? Explanation: Bitwise & operator gives 1 if both operands are 1. 1&1 = 1.


2 Answers

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.

like image 184
palswim Avatar answered Oct 02 '22 03:10

palswim


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)); 
like image 28
Jerome Avatar answered Oct 02 '22 04:10

Jerome