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))
-805306368in base 10 is exactly what you're getting:-110000000000000000000000000000in base 2. What you're looking for is the two's-complement representation.