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

How to convert a binary number into a Signed decimal number

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

我使用的步骤如下

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

bin2dec 给出转换后的十进制数为 "818" 。

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

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

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

使用一些移位技巧

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?因为这是 uintbinary string

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

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

请注意,对于正数,您不能只取 nbit = str.length;,因为字符串可能未被 0 填充,您需要知道实际有多少位使用

您可能还想为 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

这是你想要的吗?

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

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

可能不是最佳解决方案,但应该可行。在决定它是否已签名之前,您可能仍想检查二进制位数。

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

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

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

我敢肯定这会比按位运算的性能低,但它肯定会减少代码。

其他一些方式:

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)

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

诀窍是在parseInt

之前填充到32

const getSigned = binStr => parseInt(binStr.length >= 8 && binStr[0] === "1" ?
  binStr.padStart(32, "1") : binStr.padStart(32, "0"), 2) >> 0;

const signed = [
  "1100110010",   // -206
  "11111011",     //   -5
  "01111011",     //  123
  "1111111111000" //   -8
].map(getSigned);

console.log(signed);