深入理解计算机系统之二 -- 各进制数之间的转换

臭大佬 2021-02-15 10:15:07 2530
linux 
简介 这是《深入理解计算机系统<第三版>》的学习笔记。

一个字节由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这个值后面跟上20,即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