二进制二进制补码解析为十进制?

时间:2018-07-06 07:04:51

标签: javascript encoding binary type-conversion

好吧,我很困惑,这并不比我想的要简单...我想将二进制补码二进制字符串转换为适当的数字:

  

-5 =根据Wikipedia的'11111011'

因此,我认为以下内容将返回负5,但事实并非如此。看完维基百科后,看来我要做的就是减去一个,然后反转位:

  

〜(parseInt('11111011',2)-1)

但是它返回-251。令人困惑...

请注意,我将处理许多奇数位长度,而不会是8位。

3 个答案:

答案 0 :(得分:0)

这将采用未知的位模式<= 32位,如果它是<8位,则转换为正整数,如果> = 8,则以前导1表示负整数。

诀窍是在parseInt之前将其填充到32

ProjB

答案 1 :(得分:0)

一段时间后,我创建了这个解决方案...如果您对二进制和按位运算有经验,请告诉我您的想法:

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('11111011')返回-5

答案 2 :(得分:0)

我感到您的困惑。维基百科文章向您展示了8位数字的示例,但是您通常不会在javascript中处理8位数字。如果要使用javascript探索二进制数数学,则可能会使用32位,并使用按位运算符将会话强制为32bit整数。

因此翻译Wikipedia文章会为您提供:

-5看起来更像11111111111111111111111111111011

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

let str = "11111111111111111111111111111011"
console.log(str.length, 'bits')
console.log((parseInt(str, 2) >> 0))

现在应该更有意义了:

let five = '00000000000000000000000000000101'
let neg6 = '11111111111111111111111111111010'

console.log('5: ', parseInt(five, 2) >> 0)
console.log('-6: ', parseInt(neg6, 2) >> 0)

// two complement
let neg6Plus1 = '11111111111111111111111111111011'

console.log('-5: ', parseInt(neg6Plus1, 2) >> 0)