Дескриптор Javascript для двоичных файлов - 64 бит

Двоичный файл для decimal -805306368:

11111111111111111111111111111111 110100000000000000000000000000000000

Однако в Javascript я получаю следующий:

   var str = parseInt(-805306368).toString(2);
   document.write(str);

-110000000000000000000000000000

Может ли кто-нибудь объяснить, как разбор 64-битной двоичной строки из этого десятичного числа?

Ответ 1

JavaScript не использует представление двух дополнений, он использует символ - перед строкой. Это потому, что он не знает, сколько бит имеет ваш диапазон номеров.

Чтобы получить ожидаемый результат, вы можете инвертировать каждый бит:

>>> (~-805306368).toString(2)
"101111111111111111111111111111"

Тем не менее, javascript выполняет все двоичные операции с 32-битными целыми числами, поэтому это не будет работать для больших (или меньших) чисел и, по крайней мере, будет очень запутанным. Таким образом, вам нужно будет реализовать собственный алгоритм форматирования.

// example of to 32-bit-conversion:
>>> (~parseInt("1111111111111111111111111111111",2)).toString(2)
"-10000000000000000000000000000000"
>>> (~parseInt("11111111111111111111111111111111",2)).toString(2)
"0"

Моя реализация:

String.prototype.padleft = function(len, chr){...}

function get64binary(int) {
    if (int>=0)
        return int
          .toString(2)
          .padleft(64, "0");
    // else
    return (-int-1)
      .toString(2)
      .replace(/[01]/g, function(d){return +!+d;}) // hehe: inverts each char
      .padleft(64, "1");
}

Ответ 2

Вы можете снова использовать parseInt(). Он имеет необязательный второй параметр, который позволяет указать основание (или базу) числа в строке, которую вы пытаетесь проанализировать.

Например: parseInt("-110000000000000000000000000000", 2) // gives -805306368