如何将二进制数转换为带符号的十进制数

时间:2015-01-12 22:15:19

标签: javascript binary decimal

我有一个像这样的二进制数.. var data =" 1100110010"。 我试图在Javascript中将其转换为适当的带符号十进制数。

我使用的步骤如下

1)var data = "1100110010"; var bin2dec = parseInt(data,2).toString(10);

bin2dec将转换后的十进制数作为" 818" 。

但我也想访问二进制数的带符号十进制数。

此二进制代码的带符号十进制数是" -206"。

如何从给定的二进制数访问有符号和无符号十进制值。请告诉我 。任何想法都会有所帮助

4 个答案:

答案 0 :(得分:3)

可以使用JavaScript typed arrays将二进制数转换为带符号的小数。

const unsigned = 0b1111111100110010;
const [ signed ] = new Int16Array([0b1111111100110010]);

console.log(unsigned); // => 65330
console.log(signed); // => -206

我确信这比按位操作的性能要差一些,但它的代码肯定更少。

答案 1 :(得分:1)

这就是你想要的吗?

var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
var signed = (data.substr(0,1) === '1' ? '-':'+') + parseInt(data.substr(1),2);

这将为签名号码提供-306。我不确定你在问题中指出的数字是否有拼写错误(-206)。

可能不是最佳解决方案,但应该有效。在决定是否签名之前,您可能仍需要检查二进制数字的数量。

答案 2 :(得分:1)

其他方式:

const bin = "1100110010"
const decimal = parseInt(bin,2)
const numBits = bin.length

let p = 0x80000000 >> (32 - numBits) 

console.log(p | decimal)
//or:
console.log(parseInt(bin.padStart(32,'1'),2) | 0)

答案 3 :(得分:0)

使用一些位移技巧

function uintToInt(uint, nbit) {
    nbit = +nbit || 32;
    if (nbit > 32) throw new RangeError('uintToInt only supports ints up to 32 bits');
    uint <<= 32 - nbit;
    uint >>= 32 - nbit;
    return uint;
}

uintToInt(818, 10); // -206
  • 为什么818?因为这是二进制字符串

    uint
    parseInt('1100110010', 2); // 818
    
  • 为什么10?因为您的signed int由二进制字符串

    中的10位表示
    '1100110010'.length; // 10
    

请注意,对于正数,您不能只使用nbit = str.length;,因为字符串可能不是0 - 填充,您需要知道实际使用的位数< / p>

您可能还想为uint > 4294967295

引发错误

为了完整,

function intToUint(int, nbit) {
    var u = new Uint32Array(1);
    nbit = +nbit || 32;
    if (nbit > 32) throw new RangeError('intToUint only supports ints up to 32 bits');
    u[0] = int;
    if (nbit < 32) { // don't accidentally sign again
        int = Math.pow(2, nbit) - 1;
        return u[0] & int;
    } else {
        return u[0];
    }
}

intToUint(-206, 10); // 818