大家好,欢迎来到IT知识分享网。
一. 进制的含义
进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。
对于任何一种进制—X进制,就表示每一位上的数运算时都是逢X进一位。
十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
二. 进制的种类
1. 十进制
为了便于理解,我们先从我们最熟悉的十进制开始了解。在学习数学中,我们基本都是使用十进,所以十进制就是我们所熟悉的那样:
十进制的原理:逢十进一。
十进制的权重是10,每个位取0~9。
2. 二进制
因为十进制我们很是熟悉,在此不做过多概述,我们接着来看二进制。二进制是比较重要的。电子计算机出现以后,使用电子管来表示十种状态过于复杂,所以所有的电子计算机中只有两种基本的状态,开和关。 也就是说,电子管的两种状态决定了以电子管为基础的电子计算机采用二进制来表示数字和数据。
二进制的原理:逢二进一。
二进制的权重是2,每个位取0~1。
那么我们先举一个例子,十进制的1234是如何来的呢?在十进制中:
1234 = 1000 + 200 + 30 + 4
= 1*(10^3)+2*(10^2)+3*(10^1)+4*(10^0)
同理那么在二进制中的100是如何来的呢?二进制的100在十进制中时表示多少数呢?根据上面的例子,同理可得:
100 = 1*(2^2)+0*(2^1)+0*(2^0) = 4
看到这里肯定会出错的,为了方便区分,官方的我们通常情况是将每个进制用规定的特殊符号作为前缀和后缀来加以表示。
二进制规定:前缀:0B。
例如:二进制的100是十进制的4。下面程序运行结果就是4。
#include <stdio.h> int main() { int val = 0B100; printf("%d\n", val); //注意:&d输出的是十进制的数 return 0; }
3. 八进制
经过了前面二进制与十进制的学习,其实八进制与十六进制都是大同小异。
八进制的原理:逢八进一。
八进制权重是8,每个位取0~7。
那么在八进制中的123是如何来的呢?八进制的123在十进制中时表示多少数呢?我们再举个例子:
123 = 1*(8^2)+2*(8^1)+3*(8^0) = 83
八进制规定:前缀:0。
例如:八进制的123是十进制的83。下面程序运行结果就是83。
#include <stdio.h> int main() { int val = 0123; printf("%d\n", val); return 0; }
4. 十六进制
十六进制的原理:逢十六进一。
十六进制权重是16,每个位取0~15。
当然了,每个位肯定只能有一个数,那么十六进制中10/11/12/13/14/15要如何表示呢?其实就是利用英文字母所来代替。其实这里很好理解,就是用字母来表示。
二进制中的数 | 十六进制 |
10 | a/A |
11 |
b/B |
12 | c/C |
13 | d/D |
14 | e/E |
15 | f/F |
那么在十六进制中的1a2b3c是如何来的呢?十六进制的1a2b3c在十进制中时表示多少数呢?我们再举个例子:
1a2b3c = 1*(16^5)+a*(16^4)+2*(16^3)+b*(16^2)+3*(16^1)+c*(16^0)
= 1*(16^5)+10*(16^4)+2*(16^3)+11*(16^2)+3*(16^1)+12*(16^0)
=
十六进制规定:前缀:0X。
例如:十六进制的1a2b3c是十进制的。下面程序运行结果就是。
#include <stdio.h> int main() { int val = 0x1a2b3c; printf("%d\n", val); return 0; }
三. 进制之间转换
1. 二进制、八进制、十六进制转十进制
其实通过了上面的几个例子,我们已经引出了其中简单的进制转化:
OB100 = 1*(2^2)+0*(2^1)+0*(2^0) = 4
0123 = 1*(8^2)+2*(8^1)+3*(8^0) = 83
0X1a2b3c = 1*(16^5)+a*(16^4)+2*(16^3)+b*(16^2)+3*(16^1)+c*(16^0)=
所以由上述中的例子,可易得一下方法。
(1). 二进制转十进制
OBxyzw…N = x*( 2 的(x之后的位数)的次方)
+y*( 2 的(y之后的位数)的次方)
+z*( 2 的(z之后的位数)的次方)
+w*( 2 的(w之后的位数)的次方)
+……+
+N*( 2 的(N之后的位数)的次方)
(2). 八进制转十进制
0xyzw…N = x*( 8 的(x之后的位数)的次方)
+y*( 8 的(y之后的位数)的次方)
+z*( 8 的(z之后的位数)的次方)
+w*( 8 的(w之后的位数)的次方)
+……+
+N*( 8 的(N之后的位数)的次方)
(3). 十六进制转十进制
0Xxyzw…N = x*( 16 的(x之后的位数)的次方)
+y*( 16 的(y之后的位数)的次方)
+z*( 16 的(z之后的位数)的次方)
+w*( 16 的(w之后的位数)的次方)
+……+
+N*( 16 的(N之后的位数)的次方)
其实上面的转化成十进制都很好理解,但是就是下面的十进制转化成二进制、八进制、十六进制是有些难度的,但是不要担心,也并不是很难掌握,耐心即可。
2. 十进制转二进制、八进制、十六进制
a. 十进制转二进制
正数
方法一:辗转相除法,从下往上读
其实这个方法就是简单的数学方法:
例如:十进制123如何转化成二进制?
未满8个位,用0补齐。所以十进制123转化成二进制的最终结果是0B0。
方法二:分解法
分解法其实也很简单,就只要找到与它本身最相近的2的次方数。
123=64+59
=64+32+27
=64+32+16+11
=64+32+16+8+3
=2^6+2^5+2^4+2^3+2^1+2^0
所以在位数分别是7/6/5/4/2/1上的数字是1。
未满8个位,用0补齐。所以十进制123转化成二进制的最终结果是0B0。
负数
为何正数与负数的进制转化不同呢?这是因为:
正数:原码等于补码。
负数:原码与补码不同。负数的补码是其反码加一。
所以这里注意负数的进制转化与正数是有区别的。那么如何求负数的补码呢?
其实简单来说就是按位取反+1、还原符号位。
例如:-100的二进制如何表示?
-100:
注意:在最高位为 1 表示负号。
第一步求原码:100 = 64+32+4 = 2^6+2^5+2^2
原码:1110 0100
第二步求反码:按位取反,符号位不变
反码:1001 1011
第三部求补码:反码加1,1001 1011+1=1001 1100
所以-100转化成二进制的最终结果是0B1001 1100。
例如:0B1111 1100的十进制?
原码:1111 1100
反码:1000 0011
补码:1000 0100
所以,-(1*2^2+0*2^1+0*2^0)= -4
所以0B1111 1100转化成十进制的最终结果是-4。
b. 十进制转八进制
例如100的八进制如何表示?
所以100转化成八进制的最终结果是0144。
c. 十进制转十六进制
例如123的十六进制如何表示?
所以100转化成八进制的最终结果是7b。
3. 二进制转八进制、十六进制
其实,二进制转八进制、十六进制与二进制转十进制思路是相似的。我们再来回顾一下,二进制如何转十进制:
二进制转十进制:
OBxyzw…N = x*( 2 的(x之后的位数)的次方)
+y*( 2 的(y之后的位数)的次方)
+z*( 2 的(z之后的位数)的次方)
+w*( 2 的(w之后的位数)的次方)
+……+
+N*( 2 的(N之后的位数)的次方)
a. 二进制转八进制
由于2的3次方等于8,八进制和二进制之间的转化是三次方的关系,可以把二进制数分段转化,也就是从后向前开始,三位三位的转化。
例如:0B10 1001 0101 1111 0011的八进制
101 001 010 111 110 011 1*2^2+1*2^0 1*2^0 1*2^1 1*2^2+1*2^1+1*2^0 1*2^2+1*2^1 1*2^1+1*2^0 5 1 2 7 6 3
所以0B10 1001 0101 1111 0011转化成八进制的最终结果是0。
二进制转八进制:
①. OBxyzw…N 先将其每三个一划分:
OBx(1)y(1)z(1) OBx(2)y(2)z(2) OBx(3)y(3)z(3) …..OBx(N)y(N)z(N)
②. OBx(1)y(1)z(1) = x(1)*( 2 的(x(1)之后的位数==2)的次方)
+y(1)*( 2 的(y(1)之后的位数==1)的次方)
+z(1)*( 2 的(z(1)之后的位数==0)的次方)
OBx(2)y(2)z(2) = x(2)*( 2 的(x(2)之后的位数==2)的次方)
+y(2)*( 2 的(y(2)之后的位数==1)的次方)
+z(2)*( 2 的(z(2)之后的位数==0)的次方)
OBx(3)y(3)z(3) = x(3)*( 2 的(x(3)之后的位数==2)的次方)
+y(3)*( 2 的(y(3)之后的位数==1)的次方)
+z(3)*( 2 的(z(3)之后的位数==0)的次方)
③. 从前向后依次写出最终结果。
b. 二进制转十六进制
由于2的4次方等于16,十六进制和二进制之间的转化是四次方的关系,可以把二进制数分段转化,也就是从后向前开始,四位四位的转化。
例如:0B0001 0101 0010 1010 1010
0001 0101 0010 1010 1010 1 1*2^2+1*2^0 1*2^1 1*2^3+1*2^1 1*2^3+1*2^1 1 5 2 a a
所以0B0001 0101 0010 1010 1010转化成八进制的最终结果是0X152aa。
好啦,今天进制转化的学习就到这里啦~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/141888.html