поразрядно И в JavaScript с целым числом на 64 бита

Я ищу способ выполнить поразрядное И на целом числе на 64 бита в JavaScript.

JavaScript бросит все свои двойные значения в 32-разрядные целые числа со знаком, чтобы сделать битовые операции (детали здесь).

29
задан Toby Hede 6 June 2010 в 05:28
поделиться

1 ответ

Javascript представляет все числа как 64-битные числа с плавающей запятой IEEE 754 двойной точности (см. спецификацию ECMAscript , раздел 8.5.) Все положительные целые числа до 2 ^ 53 могут быть закодировано точно. Младшие биты больших целых чисел обрезаются. Это оставляет вопрос о том, как вы можете даже представить 64-битное целое число в Javascript - исходный числовой тип данных явно не может точно представлять 64-битное целое число.

Следующее иллюстрирует это. Хотя javascript кажется способным анализировать шестнадцатеричные числа, представляющие 64-битные числа, базовое числовое представление не содержит 64 бита. Попробуйте сделать следующее в своем браузере:

<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>

В Firefox, Chrome и IE я получаю следующее. Если бы числа хранились в их полном 64-битном виде, результатом должно было быть 1 для всех вычитаний. Вместо этого вы можете увидеть, как теряется разница между 2 ^ 53 + 1 и 2 ^ 53.

(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

Итак, что вы можете сделать?

Если вы решите представить 64-битное целое как два 32-битных числа, то применить побитовое И так же просто, как применить 2 побитовых И к младшему и старшему 32-м числам. немного слов.

Например:

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);

дает вам:

ff00:ff0000
31
ответ дан 28 November 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: