Javascript Decimal to Binary - 64 bit

binary, decimal, javascript

Solution

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

Problem

The binary for the decimal `-805306368` is: ``` 11111111111111111111111111111111 11010000000000000000000000000000 ``` However, in Javascript I get the following: ``` var str = parseInt(-805306368).toString(2); document.write(str); ``` ``` -110000000000000000000000000000 ``` Can anyone explain how to parse the 64 bit binary string from this decimal?

Original source