我需要使用二进制补码表示法将带符号整数编码为十六进制。例如,我想转换
e.g. -24375 to 0xffffa0c9.
到目前为止,我一直致力于以下几个方面:
parseInt(-24375).toString(2)
> "-101111100110111"
这匹配Wolfram Alpha displays,但我不知道如何获得该数字的签名24位int表示(ffffa0c9)。
我已经研究了如何取无符号二进制数并将其表示为两个补码:
~ parseInt("101111100110111", 2) + 1
> -23475
但我不确定将此数字的二进制表示转换为十六进制。
有什么想法吗?
答案 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;
}
};
}
,toInt8
,toInt16
等,然后使用它将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的十六进制应该可以正常工作。