Ответ 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");
}