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

14

我需要使用二进制补码将一个带符号的整数编码为十六进制数。例如,我想要将

e.g. -24375 to 0xffffa0c9.

到目前为止,我一直在按照以下方式工作:

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

这与 Wolfram Alpha 显示的 相符,但是我不确定如何得到带符号的 24 位整数表示形式 (ffffa0c9)。

我已经计算出如何将无符号二进制数表示为二进制补码:

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

但我不确定如何获取该数字的二进制表示以转换为十六进制。

有什么建议吗?

2个回答

7

这里有一个使用 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的十六进制数,应该可以正常工作。


1
这个完美地运作。 - user12818329

4
为了创建固定尺寸的二进制补码数字,我创建了一个工厂方法:
 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;
        }
    };
}

现在,为了解决你的问题,你可以创建函数 toInt8toInt16toInt32 等。然后使用它将 JS 数字转换为二进制补码形式。以下是使用 int8 的示例:

const toInt8 = createToInt(8);

'0x' + toInt8(-128).toString(16); // -> 0x80
'0x' + toInt8(127).toString(16); // -> 0x7f
'0x' + toInt8(-1).toString(16); // -> 0xff

// Values less then 16 should be padded
'0x' + toInt8(10).toString(16).padStart(2, '0); // -> 0x0a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接