Javascript 将带符号的十进制数转换为用两个';补语

Javascript 将带符号的十进制数转换为用两个';补语,javascript,twos-complement,Javascript,Twos Complement,我需要使用二的补码表示法将有符号的整数编码为十六进制。例如,我想转换 e.g. -24375 to 0xffffa0c9. 到目前为止,我一直在从事以下工作: parseInt(-24375).toString(2) > "-101111100110111" 这与Wolfram Alpha匹配,但我不确定如何获得数字的有符号24位int表示(ffffa0c9) 我已经解决了如何获取无符号二进制数并将其表示为2的补码: ~ parseInt("101111100110111",

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

e.g. -24375 to 0xffffa0c9.
到目前为止,我一直在从事以下工作:

parseInt(-24375).toString(2)
> "-101111100110111"    
这与Wolfram Alpha匹配,但我不确定如何获得数字的有符号24位int表示(ffffa0c9)

我已经解决了如何获取无符号二进制数并将其表示为2的补码:

~ parseInt("101111100110111", 2) + 1
> -23475
但我不确定是否能将这个数字的二进制表示形式转换为十六进制


有什么想法吗

要创建两个固定大小的“赞美”数字,我创建了factory方法:

 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;
        }
    };
}

下面是一个使用
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;
  }
}
函数decimalhextwo实现(十进制){
变量大小=8;
如果(十进制>=0){
var十六进制=十进制.toString(16);
而((十六进制长度%size)!=0){
十六进制=”“+0+十六进制;
}
返回十六进制;
}否则{
var十六进制=Math.abs(十进制).toString(16);
而((十六进制长度%size)!=0){
十六进制=”“+0+十六进制;
}
var输出=“”;
对于(i=0;i
对于长度最多为16的十六进制,应该可以正常工作

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;
  }
}