好吧,我很困惑,这并不比我想的要简单...我想将二进制补码二进制字符串转换为适当的数字:
-5 =根据Wikipedia的'11111011'
因此,我认为以下内容将返回负5,但事实并非如此。看完维基百科后,看来我要做的就是减去一个,然后反转位:
〜(parseInt('11111011',2)-1)
但是它返回-251。令人困惑...
请注意,我将处理许多奇数位长度,而不会是8位。
答案 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)