什么是二进制,八进制,十进制,十六进制,和进制之间的转换( 二 )


用竖式计算:
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)(二)
整数部分: 从后往前每三位一组 , 缺位处用0填补 , 然后按十进制方法进行转化 ,  则有:
001=1
011=3
然后我们将结果按从下往上的顺序书写就是:31 , 那么这个31就是二进制11001的八进制形式
八进制转二进制整数部分:从后往前每一位按十进制转化方式转化为三位二进制数 , 缺位处用0补充 则有:
1---->1---->001
3---->11
然后我们将结果按从下往上的顺序书写就是:11001 , 那么这个11001就是八进制31的二进制形式
二进制转十六进制二进制和十六进制的互相转换比较重要 。不过这二者的转换却不用计算 , 每个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 所有可能的值(中间略过部分)
仅四位的二进制数
快速计算方法
十进制值
十六进制值
1111
8+4+2+1
15
F
1110
8+4+2+0
14
E
1101
8+4+0+1
13
D
1100
8+4+0+0
12
C
1011
8+0+2+1
11
B
1010
8+0+2+0
10
A
1001
8+0+0+1
9
9
……
0001
0+0+0+1
1
1
0000
0+0+0+0
0
0
二进制数要转换为十六进制 , 就是以4位一段 , 分别转换为十六进制 。
如:
二进制数
1111 1101
1010 0101
1001 1011
对应的十六进制数
FD
A5
9B
十六进制转二进制反过来 , 当我们看到 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进制数:
被除数
计算过程

余数
1234
1234/16
77
2
77
77/16
4
13(D)
4
4/16
0
4
结果16进制为: 0x4D2
然后我们可直接写出0x4D2的二进制形式: 0100 1101 0010 。
其中对映关系为:
0100 -- 4
1101 -- D
0010 -- 2
同样 , 如果一个二进制数很长 , 我们需要将它转换成10进制数时 , 除了前面学过的方法是 , 我们还可以先将这个二进制转换成16进制 , 然后再转换为10进制 。
下面举例一个int类型的二进制数:


推荐阅读