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?
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?
Share Improve this question edited Jul 7, 2022 at 1:26 Teocci 8,9051 gold badge68 silver badges56 bronze badges asked Jun 7, 2012 at 17:13 StuRStuR 12.2k9 gold badges46 silver badges66 bronze badges 1-
9
There's a little semantic funny business in your question.
-805306368
in base 10 is exactly what you're getting:-110000000000000000000000000000
in base 2. What you're looking for is the two's-plement representation. – Carl Norum Commented Jun 7, 2012 at 17:16
2 Answers
Reset to default 14JavaScript does not use the two's-plement representation, it uses the hyphen -
character in front of the string to represent negative numbers. That's because two's-plement representation requires to know the length of bits. When turning a two's-plement 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))
You can use parseInt()
again. It has an optional second parameter, that enables you to specify the radix (or base) of the number in the string you are trying to parse.
Such as: parseInt("-110000000000000000000000000000", 2) // gives -805306368