Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
53
rated 0 times [  59] [ 6]  / answers: 1 / hits: 29066  / 14 Years ago, sun, june 6, 2010, 12:00:00

I am looking for a way of performing a bitwise AND on a 64 bit integer in JavaScript.



JavaScript will cast all of its double values into signed 32-bit integers to do the bitwise operations (details here).


More From » 64-bit

 Answers
50

Javascript represents all numbers as 64-bit double precision IEEE 754 floating point numbers (see the ECMAscript spec, section 8.5.) All positive integers up to 2^53 can be encoded precisely. Larger integers get their least significant bits clipped. This leaves the question of how can you even represent a 64-bit integer in Javascript -- the native number data type clearly can't precisely represent a 64-bit int.



The following illustrates this. Although javascript appears to be able to parse hexadecimal numbers representing 64-bit numbers, the underlying numeric representation does not hold 64 bits. Try the following in your browser:



<html>
<head>
<script language=javascript>
function showPrecisionLimits() {
document.getElementById(r50).innerHTML = 0x0004000000000001 - 0x0004000000000000;
document.getElementById(r51).innerHTML = 0x0008000000000001 - 0x0008000000000000;
document.getElementById(r52).innerHTML = 0x0010000000000001 - 0x0010000000000000;
document.getElementById(r53).innerHTML = 0x0020000000000001 - 0x0020000000000000;
document.getElementById(r54).innerHTML = 0x0040000000000001 - 0x0040000000000000;
}
</script>
</head>
<body onload=showPrecisionLimits()>
<p>(2^50+1) - (2^50) = <span id=r50></span></p>
<p>(2^51+1) - (2^51) = <span id=r51></span></p>
<p>(2^52+1) - (2^52) = <span id=r52></span></p>
<p>(2^53+1) - (2^53) = <span id=r53></span></p>
<p>(2^54+1) - (2^54) = <span id=r54></span></p>
</body>
</html>


In Firefox, Chrome and IE I'm getting the following. If numbers were stored in their full 64-bit glory, the result should have been 1 for all the substractions. Instead, you can see how the difference between 2^53+1 and 2^53 is lost.



(2^50+1) - (2^50) = 1
(2^51+1) - (2^51) = 1
(2^52+1) - (2^52) = 1
(2^53+1) - (2^53) = 0
(2^54+1) - (2^54) = 0





So what can you do?



If you choose to represent a 64-bit integer as two 32-bit numbers, then applying a bitwise AND is as simple as applying 2 bitwise AND's, to the low and high 32-bit 'words'.



For example:



var a = [ 0x0000ffff, 0xffff0000 ];
var b = [ 0x00ffff00, 0x00ffff00 ];
var c = [ a[0] & b[0], a[1] & b[1] ];

document.body.innerHTML = c[0].toString(16) + : + c[1].toString(16);


gets you:



ff00:ff0000

[#96575] Wednesday, June 2, 2010, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
julissaimana

Total Points: 593
Total Questions: 108
Total Answers: 112

Location: American Samoa
Member since Fri, Aug 26, 2022
2 Years ago
;