关于有符号字节的二进制转换为十六进制的问题

时间:2010-11-08 04:40:38

标签: java binary bit-manipulation signed

1) 我知道当你将二进制转换为十进制时,最左边的位代表0,1 ......等等。因此,例如,将0001转换为十进制,它是0 * 2 ^ 0 + 0 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3,因此十进制值将为8.

2) 例如,你已经签署了十六进制0x80,它将被转换为二进制1000 0000但是为了计算这个二进制表示的十进制值,它被签名,所以我们必须反转7位,所以我们得到1111111并加1给我们10000000是-128。

我的问题是为什么在第二种情况下,当我们计算有符号字节的十进制时,我们必须从最右边的位开始为0,所以我们有...... + 1 * 2 ^ 8。为什么不是2 ^ 0最左边的位,因为我们在1)中计算第二种情况?

感谢。

2 个答案:

答案 0 :(得分:4)

不,通常二进制是以另一种方式表示的...... 0001是1,1000是8。

答案 1 :(得分:2)

我回答第1点,并不完全。 0001实际上是1,而10008。你似乎来自错误的一端。二进制数1101例如是:

+------ 1 * 2^3     =  8
|+----- 1 * 2^2     =  4
||+---- 0 * 2^1     =  0
|||+--- 1 * 2^0     =  1
||||                  --
1101                = 13

对于第2点,将位模式转换为带符号数的最简单方法是首先将其转换为无符号值(0x80 = 128),然后减去偏差(256为得到-128的8位,65536为16位等等。

偏差应该只影响流程结束时的计算,这是将范围0..255映射到-128..1270..65535-32768..32767的方法。< / p>