【发布时间】:2009-12-05 14:19:07
【问题描述】:
例如,假设初始值为:
0100 0011
如果使用二进制补码,十六进制是什么,十进制是什么?
同样,如果使用补码,十六进制和十进制是什么?
更一般地说,您如何计算出这两种二进制表示形式的十六进制和十进制值?
【问题讨论】:
标签: binary
例如,假设初始值为:
0100 0011
如果使用二进制补码,十六进制是什么,十进制是什么?
同样,如果使用补码,十六进制和十进制是什么?
更一般地说,您如何计算出这两种二进制表示形式的十六进制和十进制值?
【问题讨论】:
标签: binary
十六进制很容易。只需分成 4 位组并将每个组转换为十进制。然后,很明显,用 A 替换 10,用 B 替换 11,用 C 替换 12,用 D 替换 13,用 E 替换 14,用 F 替换 15。十六进制表示通常不关心一或二的补码,而只是精确地反映位。
关于转换成十进制:根据是一或二的补码,算出符号和绝对值是什么。如果第一位为0,则为正,如果为1,则为负。
正值不需要进一步修改。负值的绝对值取决于它是 1 的补码还是 2 的补码。一个补码就是取反位(0 变为 1,1 变为 0)。对于二进制补码减 1 然后取反。
然后将绝对值中设置为 1 的位的值相加。每个位的值是两个递增指数的连续幂,从最右边的 2^0 (=1) 开始,向左递增。
这里有一些维基百科参考:
【讨论】:
在 Ruby 中:
将二进制转换为十六进制:
> '01000011'.to_i(2).to_s(16)
=> "13"
二进制转十进制:
> '01000011'.to_i(2).to_s(10)
=> "19"
如果设置了最高位,则需要减去 2**(位数)。
对于一个补码,如果设置了最高位,则需要减去 2**(位数)然后加一。
【讨论】:
我不知道你的问题是否正确,但是
01000011 十进制是 67 十六进制的 01000011 是 43
同时 十六进制和十进制的 0100 是 4,十六进制和十进制的 0011 = 3
关于转换的解释可以在这里找到: http://www.permadi.com/tutorial/numBinToDec/
【讨论】: