JavaScript does not use the two's-complement representation, it uses the hyphen -
character in front of the string to represent negative numbers. That's because two's-complement representation requires to know the length of bits. When turning a two's-complement number with a certain number of bits into one with more bits (e.g., when copying from a one-byte variable to a two-byte variable), the most-significant bit must be repeated in all the extra bits.
To get the expected result, you could invert each bit but it doesn't provide the result we want:
>>> (~-805306368).toString(2)
"101111111111111111111111111111"
Yet, JavaScript does all binary operations on 32-bit integers, so this won't work for bigger (or smaller) numbers and at least will be very confusing. So, you would need to implement your own formatting algorithm.
// example of 32-bit-conversion:
>>> (~parseInt("1111111111111111111111111111111",2)).toString(2)
"-10000000000000000000000000000000"
>>> (~parseInt("11111111111111111111111111111111",2)).toString(2)
"0"
My Implementation:
function get64binary(int) {
if (int >= 0)
return int
.toString(2)
.padStart(64, "0");
else
return (-int - 1)
.toString(2)
.replace(/[01]/g, d => +!+d) // hehe: inverts each char
.padStart(64, "1");
}
console.log(get64binary(805306368))
console.log(get64binary(-805306368))