十进制-805306368的二进制文件是:
11111111111111111111111111111111 11010000000000000000000000000000
然而,在Javascript中,我得到了following:
var str = parseInt(-805306368).toString(2);
document.write(str);
-110000000000000000000000000000
任何人都可以解释如何从这个十进制解析64位二进制字符串吗?
答案 0 :(得分:12)
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");
}
答案 1 :(得分:2)
您可以再次使用parseInt()
。它有一个可选的第二个参数,使您可以指定要尝试解析的字符串中数字的基数(或基数)。
例如:parseInt("-110000000000000000000000000000", 2) // gives -805306368