如何将二进制补码字符串解析为数字

时间:2016-05-04 08:33:06

标签: javascript

我有-3的二进制形式,以两种形式补充 - 11111111111111111111111111111101,并将其与parseInt函数一起使用:

parseInt('11111111111111111111111111111101', 2)

但它返回4294967293,这是在将11111111111111111111111111111101解析为unsigned int时产生的整数。如何将整数解析为有符号整数?

3 个答案:

答案 0 :(得分:5)

~~parseInt('11111111111111111111111111111101',2)// == -3

正是您要找的。

相关回答~~ vs-parseint

  

var x = ~~ y;是一个' - 类似于var x = y<< 0; -that(ab)使用   一元按位NOT运算符强制结果在a的范围内   带符号的32位整数,丢弃任何非整数部分。

答案 1 :(得分:0)

我遇到了同样的问题,可以使用以下方法:

function parseInt2complement(bitstring,bitcount)
{
    value = parseInt(bitstring, 2);

    if ((value & (1<<(bitcount-1))) > 0) {
       value = value - (1<<(bitcount));
    }
    return value;
}

console.log(parseInt2complement('111111111111111111111111111101', 30))
console.log(parseInt2complement('1111111111111111111111111111101', 31))

答案 2 :(得分:0)

对于32位数字,将其转换为32位整数(此处不需要parseInt)就足够了,这可以通过对其应用任何按位运算(并指示其为二进制)来完成加上0b前缀。

function parse(num){
  return ('0b'+num) | 0
}

console.log(parse('11111111111111111111111111111101'))

但是,对于非32位数字,您将需要一些技巧:

function parse(num, length = num.length){
  if(num[num.length-length] !== '1')
    return +('0b'+num)
  let inverse = ''
  for(const digit of num.slice(-length))
    inverse += +!+digit
  return -('0b' + inverse) - 1
}

console.log(parse('1101', 4)) //-3
console.log(parse('1111111111111101', 16)) //-3
console.log(parse('1111111111111111111111111111111111111111111111111111111111111101', 64)) //-3
console.log(parse('1111111111111111111111111111111111111111111111111111111111111101')) //-3, bit length inferred from the length of the string