深入理解计算机系统之二 -- 各进制数之间的转换
一个字节由8位组成。在二进制表示法中,它的值域是00000000
~11111111
。如果看成十进制整数,它的值域就是0~255。两种符号表示法对于描述位模式来说都不是非常方便。二进制表示法太冗长,而十进制表示法与位模式的互相转化很麻烦。替代的方法是以16
为基数,或者叫做十六进制(hexadecimal
) 数,来表示位模式。十六进制( 简写为 “hex
”),使用数字0~9以及字符A~F来表示16
个可能的值,A
~F
对应十进制的10
~15
,用十六进制书写,一个字节的,值域为00
~FF
。
以Ox或0X开头的数字常量被认为是十六进制的值字符 ‘A
’
既可以是大写,也可以是小写。
十六进制转化成二进制
比如,假设给你一个数字0X173A4C
, 可以 通过展开每个十六进制数字,将它转换为
二进制格式 ,如下所示:
十六进制 1 7 3 A 4 C
二进制 0001 0111 0011 1010 0100 1100
这样就得到了二进制表示000101110011101001001100
。
二进制转化成十六进制
如果给定一个二进制数字 1111001010110110110011
,可以通过首先把 它分为每4
位一组来转换为十六进制。不过要注意,如果位总数不是4
的倍数,最左边的一组可以少于4
位,前面用0
补足 。然后将每个4
位组转换为相应的十六进制数字:
二进制 11 1100 1010 1101 1011 0011
十六进制 3 C A D B 3
二进制转十进制
例如一个二进制数为10110101
,我们从右到左开始数零一二三…,数值为1
的地方,就表示有2
的N次幂,由上可以看出,0、2、4、5、7次幂上有值,所以十进制数x=2^7+2^5+2^4+2^2+2^0,x=181.
二进制 10110101
十进制 181
十进制转化成二进制
根据十进制值x,找到最接近的2的n次方的比x小的值y,然后用x=x-2^n,得到的新的x,继续这样算,例如,x=105,根据计算,可以知道y是64,即y=2^6,n为6,
105=2^6+41,新的x=41,再根据上面的方式算。41=2^5+9,9=2^3+1,1=2^0,由此,可以得到
105=2^6+2^5+2^3+2^0。n代表第几个数为1,否则为0,由上面可以得出二进制值为1101001
。
十进制 105
二进制 1101001
当值x是2
的非负整数次幂时,也就是x=2^n,我们可以很容易地将x写成十六进制形式,只要记住x的二进制表示就是1
后面跟n个0
。 十六进制数字0
代表4
个二进制0
。所以当n表示成 i+4j 的形式 ,其中0<i<3, 我们可以把x写成开头的十六进制数字为 l(i = 0)、2(i=l)、4(i = 2) 或者 8(i = 3)、后面跟随着j个十六进制的0。比如 2048=2^11,我们有n=11=3+4*2,从而得到十六进制表示2^3这个值后面跟上2
个0
,即0x800
。
十进制转十六进制
十进制和十六进制表示之间的转换需要使用乘 法或者除法来处理一般情况 。将一个十进制数字x转换为十六进制,可以反复地用16除x,得到一个商q和一个余数 r,也就x = q*16 + r,然后我们用十六进 制数字表示的r作为最低位数字,并且通过对 q反复进行这个过程得到剩下的数字 。例如 ,考虑十进制314156的转换 :
314 156 = 19 634 16 + 12 (C)
19 634= 1227 16 + 2 (2)
1227= 76 16 + 11 (B)
76= 4 16 + 12 (C)
4=0 * 16 + 4 (4)
从这里 ,我们能读出十进制示为 0x4CB2C。
十六进制转十进制
反过来 ,将一个十六进制数字转换为十进制数字,我们可以用相应的16的幂乘以每个十六进制数字。比如 ,给定数字0x7AF
, 我们计算它对应的十进制值为716^2 + 10
16^1 + 15 = 7 256 + 10 16 + 15 = 1792 + 160 + 15 = 1967。
二进制转八进制
二进制转八进制与转十六进制类似,如果给定一个二进制数字 111100101
,可以通过首先把它分为每3
位一组来转换为八进制。不过要注意 ,如果位总数不是3的倍数,最左边的一组可以少于3
位,前面用0
补足 。然后将每个3
位组转换为相应的八进制数字:
二进制 111 100 101
八进制 7 4 5
八进制转二进制
如果我们想把八进制数转换为二进制数,就可以将每一位的八进制数转换为3位二进制数了,
八进制 7 4 5
二进制 111 100 101