进制转换与编码
一、进制转换
1、进制认识与运算规则
计算机语言常用二进制表示
常见进制:二进制 、八进制、十进制、十六进制
进制运算规则:
- 二进制:逢二进一
表示方式:(下面雷同)
二进制数 | 表示数字(1~4) |
---|---|
00 | 0 |
01 | 1 |
10 | 2 |
11 | 3 |
- 八进制:逢八进一
- 十进制:逢十进一
- 十六进制:逢十六进一
- 二进制每四位(1111)最大值是15,按照四位分割转成十六进制
- 二进制每三位(111)最大值是7,按照三位分割转八进制
2、二进制与八进制
1、二进制转八进制
二进制转换成八进制的方法:取三合一法
从二进制的小数点为分界点,向左(或向右)每三位取成一位,分好组以后,对照二进制与八进制数的对应表,将三位二进制按权相加,得到的数就是一位八进制数,然后按顺序排列,小数点的位置不变,最后得到的就是一个八进制数。
二进制与八进制关系表
二进制 | 八进制 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
实例一:三三分组 满足分组
实例二:三三分组 差位补0
2、八进制转二进制
二进制转八进制简单而言就是,三三分组 二进制与八进制互相转换是以三位与一位转换,少位时添0补位。八进制转为二进制,一个八进制数分为三个二进制数,用三位二进制按权相加,最后得到二进制,小数点位置不变。
实例三:八进制转二进制
3、按权相加
二进制每位上的数乘以权,然后相加之和即是十进制数
所谓的权就是,整数部分是2的n-1次方,小数是2的n次方,其中n是数字所在的位数
4、二进制与十进制
1、二进制转十进制
二进制转十进制
- 二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。
- 首位是0就表示正整数,如果首位是1则表示负整数,正整数可以直接换算,负整数则需要先取反再换算。
- 计算机内部表示数的字节单位是定长的,如8位、16位、32位。所以位数不够时,高位补零。
实例一:二进制转十进制 正整数
实例二:二进制转十进制 负整数
最高位为1,需要先减一取反
2、十进制转二进制
十进制转二进制分为整数转二进制,和小数转二进制
整数转二进制
- 采用“除2取余,逆序排列”法;
- ①首先用2整除一个十进制整数,得到一个商和余数;
- ②然后用2去除以得到的商,又会得到一个商和余数;
- ③重复操作,一直到商为小于1时为止;
- ④将所得余数全部排列起来,由下到上一次排列。
实例:42转二进制 整数(结果:101010)
小数转二进制
- 采用“乘2取整,顺序排序”法;
- ①用2乘十进制小数,可以得到积,将积的整数部分取出;
- ②再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出;
- ③重复操作,直到积中的小数部分为零,此时0或1为二进制的最后一位,或者达到所要求的精度为止。
实例:将0.125转化为二进制
当小数部分为0就可以停止乘2了,然后顺序排序就构成了二进制的小数部分:0.001.
5、二进制与十六进制
十六进制的一位等于二进制的四位
- 熟记十进制下0~15分别对应的二进制和十六进制数值
十进制 | 二进制 | 十六进制 |
---|---|---|
0000 | 0000 | 0 |
0001 | 0001 | 1 |
0002 | 0010 | 2 |
0003 | 0011 | 3 |
0004 | 0100 | 4 |
0005 | 0101 | 5 |
0006 | 0110 | 6 |
0007 | 0111 | 7 |
0008 | 1000 | 8 |
0009 | 1001 | 9 |
0010 | 1010 | A |
0011 | 1011 | B |
0012 | 1100 | C |
0013 | 1101 | D |
0014 | 1110 | E |
0015 | 1111 | F |
- 将二进制数写好后,由右至左每四位数即断开成一段,分别换算成对应的十六进制数,再将所有换算结果从左到右按顺序写出来就行。
6、八进制与十进制
1、八进制转十进制
八进制转十进制,方法与二进制转十进制差不多。按权相加法,即将八进制每位上的数乘以位权,然后将得出来的数再加在一起。
2、十进制转八进制
- 直接法
- 间接法(十进制转二进制;二进制转八进制)
直接法
整数部分:
除8取余法,每次将整数部分除以8,余数为该位权上的数,商继续除以8,余数又为上一个位权上的数,然后以此类推一直下去,直到商为零,最后从最后一个余数向前排列就可以了。
实例:(230)[10] = (346)[8]([n]:n进制)
小数部分:与转二进制相同,乘八取整法,也就是小数部分乘以8,然后取整数部分,让剩下的小数部分再乘以8,再取整数部分…以此类推,一直乘到小数部分为零为止。例如0.13856
实例:
假设:小数部分乘以8,永远也碰不到零怎么办?
根据位数要求进行“3舍4入”
实例:取横线以上的 0.0003
attention: - 八进制转十进制:整体顺序,小数点不变,按权相加得到十进制数,小数部分从左到右乘以8的负一次方,以此类推;
- 十进制转八进制:整体顺序,小数点不变,整数部分除8,余数倒着从左向右排,小数部分乘8,整数自左向右排。
7、八进制与十六进制
图解:
1、八进制转十六进制
将八进制转换为二进制,然后再将二进制转换为十六进制,小数点位置不变
实例:将八进制的(327)O转换为十六进制
- 3 = 011;
- 2 = 010;
- 7 = 111;
- 0111 = 7;
- 1101 = D;
- 读数,读数从高位到低位,D7,即(327)O=(D7)H
2、十六进制转八进制
将十六进制转换为二进制,然后再将二进制转换为八进制,小数点位置不变
- 7 = 0111;
- D = 1101;
- 0111 = 7;
- 010 = 2;
- 011 = 3;
- 读数,读数从高位到低位,327,即(D7)H=(327)O
8、十进制与十六进制
1、十进制转十六进制
除16取余法,即每次将整数部分除以16,余数为该位权上的数,而商继续除以16,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数
实例:将十进制的(796)D转换为十六进制
- 将商796除以16,商49余数为12,对应十六进制的C;
- 将商49除以16,商3余数为1;
- 将商3除以16,商0余数为3;
- 读数,因为最后一位是经过多次除以16才得到的,因此它是最高位,读数字从最后的余数向前读,31C,即(796)D=(31C)H;
方法二:使用间接法,先将十进制转换成二进制,然后将二进制又转换成十六进制;
2、十六进制转十进制
十六进制数从低位到高位(即从右往左)计算,第0位的权值是16的0次方,第1位的权值是16的1次方,第2位的权值是16的2次方,依次递增下去,把最后的结果相加的值就是十进制的值
实例:将十六进制的(2B)H转换为十进制的步骤如下:
- 第0位 B x 16^0 = 11;
- 第1位 2 x 16^1 = 32;
- 读数,把结果值相加,11+32=43,即(2B)H=(43)D
至此,有关进制之间的互换就讲完了,这里主要是对其转换关系汇总和巩固。
二、格雷码
1、认识格雷码
- 格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式;
- 典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码;
- 格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一 的;
- 格雷码的构造方法为:直接排列以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。
2、格雷码与自然二进制转换
1、二进制转格雷码
自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高 位相异或,而格雷码其余各位与次高位的求法相类似。
原理:若二进制码表示为: B[N-1]B[N-2]…B[2]B[1]B[0];
相应地, 则二进制格雷码表示为: G[N-1]G[N-2]…G[2]G[1]G[0].
其中最高位保留: G[N-1] = B[N-1];
其他各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, …, n-2)
图示如下:
格雷码的值只需要在原来的二进制的基础上右移一位再加上原来的二进制值即可得到
2、格雷码转二进制
二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制 码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
原理: 若二进制格雷码表示为: G[N-1]G[N-2]…G[2]G[1]G[0];
相应地, 则二进制码表示为: B[N-1]B[N-2]…B[2]B[1]B[0].
其中最高位保留: B[N-1] = G[N-1];
其他各位: B[i-1] = G[i-1] xor B[i]. (i = 1, 2, …, n-1)
图示如下: