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

发布于 2024-11-09 23:53:00 字数 527 浏览 3 评论 0原文

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

e.g. -24375 to 0xffffa0c9.

到目前为止,我一直在处理以下几行:

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

这与 Wolfram Alpha 显示,但我不确定如何获取数字的有符号24位int表示(ffffa0c9)。

我已经弄清楚如何获取无符号的二进制数并将其表示为二进制补码:

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

但我不确定是否将该数字的二进制表示形式转换为十六进制。

有什么想法吗?

I need to encode a signed integer as hexadecimal using via the two's complement notation. For example I would like to convert

e.g. -24375 to 0xffffa0c9.

So far I have been working on the following lines:

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

This matches what Wolfram Alpha displays, but I am not sure how to get to the signed 24bit int representation of the number (ffffa0c9).

I've worked out how to take the unsigned binary number and represent this as two's complement:

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

but I am not sure get the binary representation of this number to convert to hex.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

早茶月光 2024-11-16 23:53:00

这是使用 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 的十六进制应该可以正常工作。

Here's a pretty straightforward solution using 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;
  }
}

Should work fine for hexadecimals with length of up to 16.

梦境 2024-11-16 23:53:00

为了创建固定大小的双补数字,我创建了工厂方法:

 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 code>等,并用它来将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

To create two's-compliment numbers of fixed size I've created factory method:

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

Now, to solve your question you can create functions toInt8, toInt16, toInt32, etc. And use it to convert JS numbers to two's compliment. Example with 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文