我有-3
的二进制形式,以两种形式补充 - 11111111111111111111111111111101
,并将其与parseInt
函数一起使用:
parseInt('11111111111111111111111111111101', 2)
但它返回4294967293
,这是在将11111111111111111111111111111101
解析为unsigned int时产生的整数。如何将整数解析为有符号整数?
答案 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