是否有一种算法可以手动将十六进制的二进制补码转换为十进制?
Posted
技术标签:
【中文标题】是否有一种算法可以手动将十六进制的二进制补码转换为十进制?【英文标题】:Is there an algorithm to manually convert the two's complement of hexadecimal to decimal? 【发布时间】:2014-02-09 19:51:20 【问题描述】:假设我有十六进制 A41B 的二进制补码形式,我想将其转换为十进制。通常,我会将其转换为二进制,翻转所有位,加一,然后将其转换为十进制并输入正确的符号(正或负)。有没有更快的手动操作方法?
【问题讨论】:
这与将“普通”十六进制转换为十进制相同,只是您必须考虑到如果最高有效位 >= 8,则需要从中减去 2^16结果。 【参考方案1】:你可以:
将其转换为十进制 从结果中减去 2N,其中 N 是您的字长(例如,对于 16 位字,减去 65536)在你的例子中,
0xA41B = 42011
42011 - 65536 = -23525
在进行减法之前,您需要检查符号位是否为 1。否则,您只会得到一个正数。
【讨论】:
【参考方案2】:来自dave's corner:
=MOD(HEX2DEC(A7)+2^15,2^16)-2^15
对于 16 位数字。
【讨论】:
【参考方案3】:如果您出于某种原因不想或不能执行其他答案建议的减法,您可以这样处理负数:
-
翻转位
添加一个
转换为十进制,就像数字是正数一样
添加负号
例如:-5 是 8 位 2 的补码中的 11111011
。翻转位并加一是00000101
,即十进制的 5。添加负号,你有 -5。
【讨论】:
以上是关于是否有一种算法可以手动将十六进制的二进制补码转换为十进制?的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化