2,8,10,16进制相互转换
进制转换
1正数
我们以(25.625)(⼗)为例讲解⼀下进制之间的转化问题。
⼗进制--->⼆进制
对于整数部分,⽤被除数反复除以2,除第⼀次外,每次除以2均取前⼀次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后⼀位余数是所求⼆进制数的最⾼位。
⼗进制转,N进制。
对于⼩数部分,采⽤连续乘以基数2,并依次取出的整数部分,直⾄结果的⼩数部分为0为⽌。故该法称“乘基取整法”。
给你⼀个⼗进制,⽐如:6,如果将它转换成⼆进制数呢?
10进制数转换成⼆进制数,这是⼀个连续除以2的过程:
把要转换的数,除以2,得到商和余数,
将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。
听起来有些糊涂?结合例⼦来说明。⽐如要转换6为⼆进制数。
“把要转换的数,除以2,得到商和余数”。
那么:
⼗转⼆⽰意图
要转换的数是6,6 ÷ 2,得到商是3,余数是0。
“将商继续除以2,直到商为0……”
现在商是3,还不是0,所以继续除以2。
那就:3 ÷ 2, 得到商是1,余数是1。
“将商继续除以2,直到商为0……”
现在商是1,还不是0,所以继续除以2。
那就:1 ÷ 2, 得到商是0,余数是1
“将商继续除以2,直到商为0……最后将所有余数倒序排列”
好极!现在商已经是0。
我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!
6转换成⼆进制,结果是110。
把上⾯的⼀段改成⽤表格来表⽰,则为:
被除数计算过程商余数
66/230
33/211
11/201
(在计算机中,÷⽤/ 来表⽰)
⼆进制数转换为⼗进制数
⼆进制数第0位的权值是2的0次⽅,第1位的权值是2的1次⽅……
所以,设有⼀个⼆进制数:0110 0100,转换为10进制为:
下⾯是竖式:
0110 0100 换算成⼗进制
第0位0 * 20 = 0
第1位0 * 21 = 0
第2位1 * 22 = 4
第3位0 * 23 = 0
第4位0 * 24 = 0
第5位1 * 25 = 32
第6位1 * 26 = 64
第7位0 * 27 = 0
公式:第N位2(N)
---------------------------
36
⽤横式计算为:
0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1* 26 + 0 * 27 = 100 0乘以多少都是0,所以我们也可以直接跳过值为0的位:
1 * 2
2 + 1 * 25 +1*26 = 100
10进制数转换成8进制的⽅法,和转换为2进制的⽅法类似,唯⼀变化:除数由2变成8。
来看⼀个例⼦,如何将⼗进制数120转换成⼋进制数。
⽤表格表⽰:
二进制小数如何转换成十进制被除数计算过程商余数
120120/8150
1515/817
11/801
120转换为8进制,结果为:170。
⼋进制--->⼗进制
⼋进制就是逢8进1。
⼋进制数采⽤0~7这⼋数来表达⼀个数。
⼋进制数第0位的权值为8的0次⽅,第1位权值为8的1次⽅,第2位权值为8的2次⽅……
所以,设有⼀个⼋进制数:1507,转换为⼗进制为:
⽤竖式表⽰:
1507换算成⼗进制。
第0位7 * 80 = 7
第1位0 * 81 = 0
第2位5 * 82 = 320
第3位1 * 83 = 512
--------------------------
839
同样,我们也可以⽤横式直接计算:
7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839
结果是,⼋进制数1507 转换成⼗进制数为839
⼗进制--->⼗六进制
10进制数转换成16进制的⽅法,和转换为2进制的⽅法类似,唯⼀变化:除数由2变成16。
同样是120,转换成16进制则为:
被除数计算过程商余数
120120/1678
77/1607
120转换为16进制,结果为:78。
⼗六进制--->⼗进制
16进制就是逢16进1,但我们只有0~9这⼗个数字,所以我们⽤A,B,C,D,E,F 这六个字母来分别表⽰
10,11,12,13,14,15。字母不区分⼤⼩写。
⼗六进制数的第0位的权值为16的0次⽅,第1位的权值为16的1次⽅,第2位的权值为16的2次⽅……
所以,在第N(N从0开始)位上,如果是是数X (X ⼤于等于0,并且X⼩于等于15,即:F)表⽰的⼤⼩为X * 16的N次⽅。假设有⼀个⼗六进数2AF5, 那么如何换算成10进制呢?
⽤竖式计算:
2AF5换算成10进制:
第0位:5 * 160 = 5
第1位:F * 161 = 240
第2位:A * 162 = 2560
第3位:2 * 163 = 8192
-------------------------------------
10997
直接计算就是:
5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997
(别忘了,在上⾯的计算中,A表⽰10,⽽F表⽰15)
现在可以看出,所有进制换算成10进制,关键在于各⾃的权值不同。
假设有⼈问你,⼗进数1234 为什么是⼀千⼆百三⼗四?你尽可以给他这么⼀个算式:
1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100
⼆进制--->⼋进制
(11001.101)(⼆)
整数部分:[1]从后往前每三位⼀组,缺位处⽤0填补,然后按⼗进制⽅法进⾏转化,则有:
001=1
011=3
然后我们将结果按从下往上的顺序书写就是:31,那么这个31就是⼆进制11001的⼋进制形式
⼩数部分:从前往后每三位⼀组,缺位处⽤0填补,然后按⼗进制⽅法进⾏转化,则有:
101=5
然后我们将结果部分按从上往下的顺序书写就是:5,那么这个5就是⼆进制0.101的⼋
进制形式
所以:(11001.101)2=(31.5)8
⼋进制--->⼆进制
(31.5)(⼋)
整数部分:从后往前每⼀位按⼗进制转化⽅式转化为三位⼆进制数,缺位处⽤0补充则有:
1---->1---->001
3---->11
然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是⼋进制31的⼆进制形式
说明,关于⼗进制的转化⽅式我这⾥就不再说了,上⼀篇⽂章我已经讲解了!
⼩数部分:从前往后每⼀位按⼗进制转化⽅式转化为三位⼆进制数,缺位处⽤0补充则有:
5---->101
然后我们将结果按从下往上的顺序书写就是:101,那么这个101就是⼋进制5的⼆进制形式
所以:(31.5)8=(11001.101)2
⼗六进制<--->⼆进制
⼆进制和⼗六进制的互相转换⽐较重要。不过这⼆者的转换却不⽤计算,每个C,C++程序员都能做到看见⼆进制数,直接就能转换为⼗六进制数,反之亦然。
我们也⼀样,只要学完这⼀⼩节,就能做到。
⾸先我们来看⼀个⼆进制数:1111,它是多少呢?
你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 =
15。
然⽽,由于1111才4位,所以我们必须直接记住它每⼀位的权值,并且是从⾼位往低位
记,:8、4、2、1。即,最⾼位的权值为23 = 8,然后依次是22 = 4,21=2,20 = 1。
记住8421,对于任意⼀个4位的⼆进制数,我们都可以很快算出它对应的10进制值。
下⾯列出四位⼆进制数xxxx 所有可能的值(中间略过部分)
仅四位的⼆进制数快速计算⽅法⼗进制值⼗六进制值
11118+4+2+115F
11108+4+2+014E
11018+4+0+113D
11008+4+0+012C
10118+0+2+111B
10108+0+2+010A
10018+0+0+199
……
00010+0+0+111
00000+0+0+000
⼆进制数要转换为⼗六进制,就是以4位⼀段,分别转换为⼗六进制。
如:
⼆进制数1111 11011010 01011001 1011
对应的⼗六进制数FD A59B
反过来,当我们看到FD时,如何迅速将它转换为⼆进制数呢?
先转换F:
看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何⽤8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。
接着转换D:
看到D,知道它是13,13如何⽤8421凑呢?应该是:8 + 4 + 1,即:1101。
所以,FD转换为⼆进制数,为:1111 1101
由于⼗六进制转换成⼆进制相当直接,所以,我们需要将⼀个⼗进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。
⽐如,⼗进制数1234转换成⼆制数,如果要⼀直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:
被除数计算过程商余数
12341234/16772
7777/16413(D)
44/1604
结果16进制为:0x4D2
然后我们可直接写出0x4D2的⼆进制形式:0100 1101 0010。
其中对映关系为:
0100 -- 4
1101 -- D
0010 -- 2
同样,如果⼀个⼆进制数很长,我们需要将它转换成10进制数时,除了前⾯学过的⽅法是,我们还可以先将这个⼆进制转换成16进制,然后再转换为10进制。
下⾯举例⼀个int类型的⼆进制数:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论