中国有哪些特种兵:八进制转十六进制是怎么转换的?(仅回答这一个问题)

来源:百度文库 编辑:神马品牌网 时间:2024/05/06 03:50:11
好像不能直接转换,是这样的吗?
必须要用一个中间值才行,是吗?比如用二进制做中间或十进制,间接转换是这样的吗?
如果8能直接转16,那有什么公式?

例如八进制37,3和7分别转换成三位二进制数,7等于111,三等于011,37等于011111
四位二进制等于一位十六进制1F

用八进制的一个数转换成两个十六进制!

八进制转换成十六进制:不能直接转换,通过将其中一个转换成二进制,再由二进制进行转换。

考虑一个10进制数123,数字1、2、3在这个数中的重要性是不一样的,3代表的是100的3倍,2代表101的2倍,而1代表的则是102的1倍。数学上把100,101和102称为对应数位上的权重(简称权),分别表示了对应位上的数字对整个数值的“贡献”。对于10进制数来说,各位权从小到大分别是100、101、102……,都是10的各次幂。对于各位上的数字,我们称为某权的系数,简称系数。

其他进制数也存在同样的问题,例如2进制数各位权重分别是2的各次幂,8进制数是8的各次幂等等。

需要说明的是,各种进制数都是人们为了理解数而进行的一种表述,在计算机计算过程中,是不存在进制这种概念的,对于C语言表示数的三种形式:0x12(16进制)、18(10进制)和022(8进制),在内存中都是一样的。

如果已经知道一个数k,在某种进制w条件下,计算各位的系数一般采用除余法,基本算法如下:

首先估计这个数的最大位数N
n = N,divisor = wn-1
b(n) = k / divisor, k = k % divisor,divisor = divisor /w,n --
如果n ==0算法结束 ,否则转3
例如对于C语言中的unsigned char 类型,最大可能为3位8进制数,如果已经知道一个数n=252,计算8进制的过程如下:

N =3
n = N,divisor = 8n-1 = 64
b(3) = 252 / 64 = 3, k = k % 64 =60,divisor = divisor /8 = 8,n -- = 2
b(2) = 60/8 = 7,k = k %8 =4,divisor = 8/8 =1,n = 1
b(1) = k / 1= 4 ,k=k %1 =0,divisor = 1/8,n = 0
n == 0算法结束
计算结果252就是8进制数0374

如果不按照上面的幂次方式规定各位数的权,也可以定义一些特殊的进制数。例如,我们按照从小到大顺序分别规定各位的权重分别为w(n),n=1,2,3....,(注意,必须满足w(n) | w(m),n<= m,也就是低位权必须能整除高位权)已知一个数计算各位系数也一样可以采用修正后的除余法。修正后的除余法为:

首先估计这个数的最大位数N
n = N,divisor = w(n)
b(n) = k / divisor, k = k % divisor,n--,divisor = w(n)
如果n ==0算法结束 ,否则转3
可见,当w(n) = bn时,这个修正的除余法就和开始的除余法等价了

如果需要在不同进制间转换,最简单的方法是先把一种不容易进行四则运算的进制转换成容易进行四则运算的10进制,然后利用除余法转换成给定的进制。例如对于022,很容易利用权的定义计算出他的10进制形式为2 * 81 + 2 * 80 = 18,转换成16进制利用除余法可以得到为0x12。

用windows自己带的计算器就可以,不过你要他设置成科学型,就是在计算器的查看目录下。

直接转好像有点麻烦,先把八进制转换成二进制,在转换成十六进制的