转自:https://blog.csdn.net/ruidianbaihuo/article/details/87797979
概念:
二进制是计算机唯一使用的进制,因为计算机的根本是电路,电路只能表示两种情况,一种情况为没有电,可以表示数字0,一种情况为有电,可以表示数字1,再无第三种情况。
计算机中使用的都是二进制,八进制和十六进制的出现其实都不是计算机的需要,它们的出现完全是出于表达和识别的方便性考虑的。一个较大的数用二进制表示就太长了,比如一个int类型的100(4个字节,总共32位),用二进制表示就是0000 0000 0000 0000 0000 0000 0110 0100,这还是一个比较小的数,如果更大,将会更复杂,写这么长,确实有些不便,于是,就出现了更简易的八进制,十进制,十六进制,数制越大,表示一个数所需的数码位数就越少,所以C和C++代码中不能直接输入二进制,但是允许输入八进制、十进制、十六进制。
那为什么没有出现什么七进制,九进制呢?因为8,16分别是2的3次方、4次方。使得这3种进制之间转换起来很方便。
八进制、十六进制即缩短了数的表示位数,同时保持了二进制数的表达特点。
表达方式:二进制:(010100101)B 八进制:(12565)O或者是(12565)Q 十进制:(2356)D 十六进制:(56BBA)H
计算方式:
其他进制转成十进制:
(2356)D
(110)B
(2356)O
十进制转成其他进制:
十进制转为二进制:(已48为例)
计算过程 | 结果 | 余数 |
---|---|---|
48/2 | 24 | 0 |
24/2 | 12 | 0 |
12/2 | 6 | 0 |
6/2 | 3 | 0 |
3/2 | 1 | 1 |
用48除以进制基数2,直到结果为1(为什么说直到结果为1,因为不管任何数,按照上面的演算方式不断除以2,最后的结果一定是1),然后将结果的1放在最前面,后面依次写上每一步的余数,注意,这里每一步的余数是倒序(也就是从下往上排列),也就是说排在结果1后面的余数是计算过程3/2的余数,然后是计算过程6/2的的余数…所以最后得出十进制数48的二进制表示是110000。如果是byte类型,需要在前面补0,直至8位:0011 0000,如果是int类型就是:0000 0000 0000 0000 0000 0000 0011 0000。
十进制转为八进制:
十进制360转换为八进制表示:
计算过程 | 结果 | 余数 |
---|---|---|
360/8 | 45 | 0 |
45/8 | 5 | 5 |
结果5比进制基数8小,所以结果就是550。
十进制转换为十六进制:
十进制101转换位十六进制的表示:
计算过程 | 结果 | 余数 |
---|---|---|
101/16 | 6 | 5 |
结果为:65。
二、八、十六进制间的相互转换
二进制转换为八进制:
这里转换的时候是有技巧的,之前说过了,为什么是八进制、十六进制,而不是七进制,九进制,因为8=23,16=24。
所以二进制转换成八进制的时候,只需要将二进制的表示从右往左开始,每三位二进制数为1组 ,分到最后如果不足3位,那么剩下多少位就是多少位,再用每组的二进制的每一位数从右往左依次乘以、
、
,然后相加,得出一组的结果,最后将所有组的结果相连,得出最终的结果(这里注意了,二进制转换为八进制的时候是分组了,并且最后是将每组的结果相连,而不是相加)。
这里,我具体举个例子:
二进制(0011 0101)B转换为八进制表示是什么结果:
首先,将二进制从右至左进行分组:
分别是 第一组:101 第二组:011 第三组:00。实际上,第三组没意义了,因为都是0,我们来关注前两组
第一组计算过程是:1 * +0 *
+1 *
=5;
第二组计算过程是:0 * +1 *
+1 *
=6;
所以最后的结果是65。也就是用6和5直接相连,而不是相加,这里还要注意一下相连的顺序问题,是6–5的方向。
二进制转换为十六进制
二进制转换为十六进制就是将二进制每四位二进制为一组,其他与八进制转换为二进制一样。
八进制转换为二进制
只需要将八进制的每一个数用三位二进制表示,然后相连既可以。比如(65)O:(6)O用二进制表示110、(5)O用二进制表示101 ,所以二进制为:(110101)B
十六进制转换为二进制
只要需要将十六进制的每一个数用四位二进制表示,然后相连即可。
八进制转换为十六进制
不要以为八和十六之间存在倍数2的关系就有什么捷径,实际上没有,需要通过二进制中转一下。
所以需要先将八进制转换成二进制,在转换成十六进制。
十六进制转换成八进制
需要将十六进制转换成二进制,再将二进制转换成八进制。
⑹、浮点数的表示与转换 –浮点数说白了就是我们常说的小数,只不过专业的叫法是"浮点数"。
上面说的都是有关二进制,八进制,十进制,十六进制整数之间的相互转换,现在我们来看一下这些进制的浮点数如何表示以及相互转换的(主要说明二、八、十六进制的浮点数如何转换成十进制的浮点数)。
相关进制的浮点数表示其实和整数的表示是一样的,比如二进制的浮点数表示:
这里我直接上示例了:
(0.1101)B就是表示这是一个二进制的浮点数。
(0.1101)O或者(0.1101)Q就是表示这是一个八进制的浮点数。
(0.1101)D就是表示这是一个十进制的浮点数。
(0.1101)H就是表示这是一个十六进制的浮点数。
那么二、八、十六进制的浮点数如何转换成十进制的浮点数呢?
这里我以二进制位例子详细说明,八进制和十六进制的转换方法与二进制是一样的,只是需要将对应的进制基数替换一下就行。
(0.1101)B这样的二进制浮点数转换成十进制的浮点数是多少呢?
转换的方式为:先提一个问题:为什么我这里举例是纯小数(整数部分为0),因为整数部分的转换和整数的转换是一样的,上面已经说明了,这里仅说明浮点数的转换。
需要将(0.1101)B转换为十进制的浮点数,首先从小数点右起第一位开始,这里的右起第一位是1,就用,第二位是1,继续用1 *
,第三位是0,用0 *
,第四位是1,用1 *
,没有第五位了,如果有,则继续按照以上逻辑以此类推,直到二进制的所有有效位数用完,然后将所有的结果全部相加,即得到了十进制的浮点数表示。
这里再清晰写一遍:
(0.1101)B转换为10进制的浮点数过程:+1 *
+0 *
+1 *
= (0.6875)D。
这里需要特别注意的是:整数部分的转换幂指数是从0开始的,但是浮点数转换的幂指数是从-1开始的,这个非常的重要,并且位数和幂指数是对应的,第一位幂指数是-1,第二位幂指数是-2,第三位幂指数是-3…以此类推,最后将所有结果相加。
八进制浮点数转换为十进制浮点数只需要将进制基数变为8,十六进制浮点数转换为十进制浮点数只需要将进制基数变为16。如果不熟悉的码友可以自行用纸笔演练一遍,只是要牢记,需要替换上对应的进制基数。
实际上,浮点数的二进制、八进制、十进制、十六进制之间的相互转换可以分为两部分,小数点左边的整数部分转换与上文提到的整数转换完全一致,小数点右边的小数部分转换与上文提到的浮点数转换也完全一致(再次提醒,需要替换成对应的进制基数),所以一个浮点数的转换,可以分成整数部分的转换,小数部分的转换,再将转换结果通过小数点"."连起来就是最后的结果了。