Javascript 二进制二补数到十进制数的解析?

Javascript 二进制二补数到十进制数的解析?,javascript,encoding,binary,type-conversion,Javascript,Encoding,Binary,Type Conversion,嗯,我很困惑,这并不比我想象的容易。。。我想将一个二进位二进制字符串转换为适当的数字: -5='11111 011'根据 所以我认为下面的结果会返回负5,但事实并非如此。阅读维基百科后,我似乎只需要减去一,然后倒转位: ~(parseInt('1111011',2)-1) 但它返回-251。迷惑 请注意,我将处理许多奇数位长度,所有长度都不是8位。这将采用未知位模式=8,前导为1,负符号int 诀窍是在parseInt之前填充到32 函数getSigned(binStr){ binStr=bi

嗯,我很困惑,这并不比我想象的容易。。。我想将一个二进位二进制字符串转换为适当的数字:

-5='11111 011'根据

所以我认为下面的结果会返回负5,但事实并非如此。阅读维基百科后,我似乎只需要减去一,然后倒转位:

~(parseInt('1111011',2)-1)

但它返回-251。迷惑


请注意,我将处理许多奇数位长度,所有长度都不是8位。

这将采用未知位模式=8,前导为1,负符号int

诀窍是在parseInt之前填充到32

函数getSigned(binStr){
binStr=binStr.length>=8&&binStr[0]=“1”?
binStr.padStart(32,“1”):
binStr.padStart(32,“0”);
返回parseInt(binStr,2)>>0
}
[
"11111011", // -5
"01111011", // 123
"1111111111000" // -8
].forEach(功能(binStr){
let signed=getSigned(binStr)
控制台日志(签名);

});经过一段时间的研究,我创建了这个解决方案。。。如果您对二进制和位运算有经验,请告诉我您的想法:

function getSignedInteger(bits) {
    let negative = (bits[0] === '1');
    if (negative) {
        let inverse = '';
        for (let i = 0; i < bits.length; i++) {
            inverse += (bits[i] === '0' ? '1' : '0');
        }
        return (parseInt(inverse, 2) + 1) * -1;
    } else {
        return parseInt(bits, 2);
    }
}
函数getSignedInteger(位){
设负=(位[0]=“1”);
如果(否定){
让倒数=“”;
for(设i=0;i
getSignedInteger('11111 011')返回-5


我感觉到你的困惑。wikipedia的文章向您展示了8位数字的示例,但您通常不会在javascript中处理8位数字。如果您想探索javascript中的二进制数数学,您可能会使用32位,并使用位运算符将对话强制为32位整数

因此,翻译维基百科文章会给你以下信息:

-5看起来更像
11111111111111111111111 011

所有那些多余的零都会被翻转。考虑到这一点,这更有意义:

let str=“11111111111111111111 011”
console.log(str.length,'bits')

log((parseInt(str,2)>>0))
这有用吗?还是这个?我看了每一个问题,我可以找到关于它,但仍然无法让它工作…为什么这对你不工作<代码>变量二进制=(-5>>>0).toString(2);//强制为uint32
我正在尝试从字符串转换为数字,我不知道数字。您对此有何看法?parseInt('11111 011'.padStart(32,'1'),2)>>0@wayofthefuture这给了我预期的结果。@wayoffuture-是的,这有助于实现所有32位。两位伟人;)我更新了答案。现在更优雅了。我看到了你的评论——我们得出了相同的结论:)