将带符号的十进制转换为带有二进制补码的十六进制编码

时间:2011-05-26 23:17:35

标签: javascript twos-complement

我需要使用二进制补码表示法将带符号整数编码为十六进制。例如,我想转换

e.g. -24375 to 0xffffa0c9.

到目前为止,我一直致力于以下几个方面:

parseInt(-24375).toString(2)
> "-101111100110111"    

这匹配Wolfram Alpha displays,但我不知道如何获得该数字的签名24位int表示(ffffa0c9)。

我已经研究了如何取无符号二进制数并将其表示为两个补码:

~ parseInt("101111100110111", 2) + 1
> -23475

但我不确定将此数字的二进制表示转换为十六进制。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

要创建固定大小的二进制补全数字,我创建了工厂方法:

dict

现在,要解决您的问题,您可以创建函数 function createToInt(size) { if (size < 2) { throw new Error('Minimum size is 2'); } else if (size > 64) { throw new Error('Maximum size is 64'); } // Determine value range const maxValue = (1 << (size - 1)) - 1; const minValue = -maxValue - 1; return (value) => { if (value > maxValue || value < minValue) { throw new Error(`Int${size} overflow`); } if (value < 0) { return (1 << size) + value; } else { return value; } }; } toInt8toInt16等,然后使用它将JS数字转换为二进制补码。 int8的示例:

toInt32

答案 1 :(得分:1)

这是使用parseInt的非常简单的解决方案:

function DecimalHexTwosComplement(decimal) {
  var size = 8;

  if (decimal >= 0) {
    var hexadecimal = decimal.toString(16);

    while ((hexadecimal.length % size) != 0) {
      hexadecimal = "" + 0 + hexadecimal;
    }

    return hexadecimal;
  } else {
    var hexadecimal = Math.abs(decimal).toString(16);
    while ((hexadecimal.length % size) != 0) {
      hexadecimal = "" + 0 + hexadecimal;
    }

    var output = '';
    for (i = 0; i < hexadecimal.length; i++) {
      output += (0x0F - parseInt(hexadecimal[i], 16)).toString(16);
    }

    output = (0x01 + parseInt(output, 16)).toString(16);
    return output;
  }
}

对于长度不超过16的十六进制应该可以正常工作。