#D211. 计算机编码系统

计算机编码系统

认识二进制系统

认识二进制

所有计算机都是电子设备,可以做一件事:检测电信号是“打开”还是“关闭”。因此,早期的计算机科学家认识到,用只有数字0011(基数为22)的二进制数系统, 比我们生活中常用的十进制数01290, 1,2,…,9(基数为1010)系统对操作计算机更为便捷。

基数:某进制中所用到的数字符号的个数。在基数为 RR 的计数制中包含01,2,,R10,1,2,…,R-1RR 个数字符号,进位规律是逢RR进一,称为RR进制。

位权:用来表示不同数位上数值的大小的一个固定常数,不同的数位位权不同。

人们把每个二进制称为位 (bit)。11表示“开”或“真”,00表示“关”或“假”。

十进制转换为二进制

十进制整数转换为二进制

方法:短除22取余

十进制数除以22,得到的商值继续除以22,依此步骤继续向下运算直到商为00为止,从商为00时的余数开始,倒序输出余数,即为我们要求的二进制数。

例题:将53用二进制数表示

方法一:用列式表示

第一步:用53不断的短除2,直到商为0,余数保存下来;

(1)53÷2=2615 3 \div 2 = 2 6 \cdots 1

(2)26÷2=13026 \div 2 =13\cdots0

(3)13÷2=611 3 \div 2 = 6 \cdots 1

(4)6÷2=306 \div 2 = 3 \cdots 0

(5)3÷2=113 \div 2 = 1 \cdots 1

(6)1÷2=011÷2=0\cdots1

第二步:从商为00时的余数开始倒序输出余数即为我们要求的二进制数。所以5310=110101253_{1 0} = 1 1 0 1 0 1_{2}

方法二:用短除式表示

image

十进制小数转换为二进制

方法:乘22取整

每次与22相乘,整数值放一边,直到整数部分到00为止,再顺序写出整数值,就是十进制小数部分转换成二进制的结果。 如果整数部分不能为00,进入无限循环,则二进制数进入无限循环。

再顺序写出整数值,注意循环节,就是十进制小数部分转换成二进制的结果。 例题: (1) 写出0.3750.375的二进制码

0.3752=0.750.375*2=0.75 ====取出整数部分00

0.752=1.50.75*2=1.5 ====取出整数部分11

0.52=1.00.5*2=1.0 ====取出整数部分11

从上到下写出整数部分为:0.0110.011

(2)写出0.70.7的二进制码

0.72=1.40.7*2=1.4 ====取出整数部分11

0.42=0.80.4*2=0.8 ====取出整数部分00

0.82=1.60.8*2=1.6 ====取出整数部分11

0.62=1.20.6*2=1.2 ====取出整数部分11

0.22=0.40.2*2=0.4 ====取出整数部分00

从上到下写出整数 0.70.7的二进制数是0.101100.10110

例题:将24.12524.125用二进制数表示

24.12524.125 既有整数又有小数,分开转化,

整数部分除22取余进行转化;小数部分乘22取整进行转化。

2424的二进制为1100011000

0.125的二进制为0.0010.125 的二进制为 0.001

24.125的二进制为11000.00124.125的二进制为11000.001

二进制转换为十进制

方法:按权展开求和

(1)先将二进制的数写成加权系数与该位上的数的乘积展开式;

(2)再根据十进制的加法规则进行求和。

二进制数的基数是22

ii位的位权是 2i12^{i-1}

例题:

(1)将二进制数转换为十进制数

101121011_2 =123+022+121+120= 1 * 2^{3} + 0 * 2^{2} + 1 * 2^{1} + 1 * 2^{0} =18+12+1=11=1*8+1*2+1=11

(2)将二进制(0.1112(0 . 1 1 1_{2}转换为十进制数

$(0 . 1 1 1)_{2} = 1 * 2^{ - 1} + 1 * 2^{ - 2} + 1 * 2^{ - 3}$

= $1 * \frac{1}{2} + 1 * \frac{1}{2^{2}} + 1 * \frac{1}{2^{3}}$

=0.5+0.25+0.125=0.5+0.25+0.125

=0.875= 0 . 8 7 5

(3)将二进制101.10121 0 1 . 1 0 1_{2}转换为十进制数 101.10121 0 1 . 1 0 1_2 $= 1 * 2^{2} + 1 * 2^{0} + 1 * 2^{ - 1} + 1 * 2^{ - 3}$ =3.625= 3 . 6 2 5

八进制和十六进制与二进制的互换

计算机中的存储是以二进制来进行存储的,对于一个稍微大点的数(十进制),用二进制存储会变得很长,譬如10211021,存储成二进制就是11111111011111111101,人们为了解决存储很长,但又要保留二进制的便利性,提出了八进制和十六进制。

人们将33位二进制数字组合在一起,表示一个基数8位的数字称为八进制;

而将44位二进制数字组合在一起,表示一个基数1616位的数字并称为十六进制。

下表显示了这些基准中的等效值:

image

从上表可知,用33个二进制数字表示的最大值是77,用44位表示的最大值是1515

88进制的数字表示是0077

1616进制的表示是090-9, A-F (表示101510-15, 譬如A代表1010, B代表1111, 以此类推)。

1、二进制转成八进制/十六进制

如果是八进制,从右往左每三位二进制转换成一位八进制; 如果是十六进制,从右往左每四位二进制转换成一位十六进制;

如果在转换的过程中,不够三位 (或四位),那么在最左边补0凑成三位(或四位)

$1 0 0 1 0 1 0 1 0_{2} = 0 0 1 0 0 1 0 1 0 1 0_{2} = 1 1 2 6_{8}$

$1 0 0 1 0 1 1 0_{2} = 0 0 1 0 0 1 0 1 0 1 0_{2} = 2 5 6_{1 6}$

例题:

(1) 写出10101110111010121 0 1 0 1 1 1 0 1 1 1 0 1 0 1_{2}的八进制数

解题过程:

第一步:从右到左,每三位一组,最左边一组只有1111,因此在左边补齐2200,(因为在左边补0不会影响该数的大小)。

0010101110111101012001010111011110101_2

第二步:每三位转换成一位八进制

$0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 2 = 1 2 7 3 6 5_{8}$

(2) 写出10101110111010121 0 1 0 1 1 1 0 1 1 1 0 1 0 1_{2}的十六进制数

解题过程:

第一步:从右到左,每四位一组,刚好分成4组。

10101101111010121 0 1 0 1 1 0 1 1 1 1 0 1 0 1_2

第二步:每四位转换成一位十六进制

$1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 2 = \textrm{A E F} 5_{1 6}$

2、八进制/十六进制转成二进制

八进制转二进制的过程和二进制转八进制的过程是相反的,是将一位八进制用等值的三位二进制来替换,最左边的一位八进制如果转成的三位二进制有前导0,忽略前导0,因为它们不影响数的大小;

十六进制转二进制的过程和二进制转十六进制的过程是相反的,是将一位十六进制用等值的四位二进制来替换,最左边的一位十六进制如果转成的四位二进制有前导0,而忽略前导0,因为它们不影响数的大小。

例题:

(1)将八进制数36018转换成二进制数

解题过程:

第一步:将每个八进制用等值的三位二进制来表示。

0111100000012011110000 001_2

第二步:忽略前导0

$3 6 0 1 8 = 0 1 1 1 1 0 0 0 0 0 0 1_{2} = 1 1 1 1 0 0 0 0 0 0 1_{2}$

(2)将十六进制数2A0D162A0D_16转换成二进制数 解题过程:

第一步:将每个十六进制用等值的四位二进制来表示。

0010101000001101200101010 0000 1101_2

第二步:忽略前导00

$2 A O D_{1 6} = 0 0 1 0 1 0 0 0 0 0 1 1 0 1_{2} = 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1_2$

任意进制转换为十进制

十进制数,基数是1010,第ii 位的位权是10i110^{i-1}

二进制数,基数是22,第ii位的位权是2i12^{i-1}

八进制数,基数是88,第ii位的位权是 8i18^{i-1}

十六进制数,基数是1616,第ii位的位权是16i116^{i-1}

nn 进制数,基数是 nn,第ii位的位权是ni1n^{i - 1}

1、任意进制数转换成十进制数 我们利用10的幂方来表示一个十进制数,需要记住两个定律: a0a^{0} = 1(a0)1(a \neq 0)任何非零数的00次方等于11; 任何数和00相乘为00

因此:

$4 3 8 1 = 4 * 1 0 0 0 + 3 * 1 0 0 + 8 * 1 0 + 1 = 4 * 1 0^{3} + 3 * 1 0^{2} + 8 * 1 0^{1} + 1 * 1 0 ^{0}$

$5 0 0 7 0 = 5 * 1 0^{4} + 0 * 1 0^{3} + 0 * 1 0^{2} + 7 * 1 0^{1} + 0 * 1 0^{1} = 50000 + 70$

这叫位权和,在前面提到的二进制转换为十进制的内容里,我们知道了二进制如何转换为十进制:

$1 1 0 1_{2} = 1 * 2^{3} + 1 * 2^{2} + 0 * 2^{1} + 1 * 2^{0} = 8 + 4 + 0 + 1 = 1 3_{1 0}$

其他所有任意进制都可以用位权求和来将它们转换成十进制。 例题:

(1)将八进制数175175转成十进制

$1 7 5_{8} = 1 * 8^{2} + 7 * 8^{1} + 5 * 8 ^{0} = 1 * 6 4 + 7 * 8 + 5 * 1 = 6 4 + 5 6 + 5 = 1 2 5_{1 0}.$

(2)将十六进制数A5E转成十进制 $A 5 E_{1 6} = 1 0 * 1 6^{2} + 5 * 1 6^{1} + 1 4 * 1 6 ^{0} = 1 0 * 2 5 6 + 5 * 1 6 + 1 4 * 1 = 2 5 6 0 + 8 0 + 1 4 = 2 6 5 4_{1 0}.$

(3)将五进制数34.134.1转成十进制 整数部分:345=351+450=193 4_{5} = 3 * 5^{1} + 4 * 5^{0} = 1 9

小数部分:0.15=151=0.20 . 1_{5} = 1 * 5^{ - 1} = 0 . 2

34.15=19.2\therefore 3 4 . 1 5 = 1 9 . 2

2、十进制数转换成任意进制数

十进制数转化为任意进制数是类似十进制数转成二进制数的。 假设要转化为 nn 进制,那么短除nn倒序取余即可。

需要注意的是,如果n10n \geqslant 1 0 ,那么余数也可能大于等于1010,需要将大于等于1010的数转化为对应的字母。 例题:

(1)将15315377进制数表示 (1)153÷7=21615 3 \div 7 = 2 1 \cdots 6

(2)21÷7=3021 \div 7 =3\cdots0

(3)3÷7=033 \div 7 = 0 \cdots 3

15310=30671 5 3_{1 0} = 3 0 6_{7}

(2) 1031031313 进制数表示

(1)103÷13=71210 3 \div 13 = 7 \cdots 12

(2)7÷13=077 \div 13 =0\cdots7

103=7C131 0 3 = 7 C_{1 3}

(六)非十进制数的加减法

我们回顾一下十进制数的加减法的原理。

加法:两数之和满10则进位。 例如,15+48=6315+48=63,因为5+8=135 + 8 = 1 3 ,所以当前位(个位)保留3311进位到下一位(十位)。

减法:对应位置的被减数不够减去减数时,从下一位借位11,并在当前数字中加上1010

例如,75485875-48,5-8不够减,跟前一位77借一位变成1010,于是就是158=715-8=7, 前一位77减去11变成66, 64=26-4=2, 故差为2727

这个十进制加减法规则可以运用到任何非十进制数的加减法中。

根据对应的进制的基数,进行进位和减位。

譬如二进制加法,满2211,八进制加法,满8811,十六进制加法满161611

减法也类似,

二进制减法退11当做22,八进制减法退11当做88,十六进制减法退11当做1616

我们来看几个例子:

1、二进制加减法 (1)02+02=020_{2} + 0_{2} = 0_{2}

(2)02+12=120_{2} + 1_{2} = 1_{2}

(3)l2+12=102l_{2} + 1_{2} = 1 0_{2}

(4)10212=121 0_{2} - 1_{2} = 1_{2}

2、八进制加减法

(1)78+18=1087_{8} + 1_{8} = 1 0_{8}

(2)10818=781 0_{8} - 1_{8} = 7_{8}

3、十六进制加减法

(1)716+916=10167_{1 6} + 9_{1 6} = 1 0_{1 6}

(2)F16316=C16F_{1 6} - 3_{1 6} = C_{1 6}

(3)F16+316=1216F_{1 6} + 3_{1 6} = 1 2_{1 6}

非十进制的加减法都可以用十进制的竖式来推演计算过程。

2.1.2.原码、反码、补码系统

计算机中的有符号数有三种表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号位用00表示“正”,用11表示“负”,

而数值位,三种表示方法各不相同。

在计算机系统中,数值一律用补码来表示和存储。

原码、反码、补码

原码:最高位表示符号位 (0表示正;1表示负),其它数字位代表数值本身的绝对值的数字二进制表示方式。

反码:如果是正数,则表示方法和原码一样;

如果是负数,符号位不变,其余各位依次取反。

补码:如果是正数,则表示方法和原码一样;

如果是负数,则将数字的反码加上1。

正数和0的原码、反码、补码相同。

例题:

(1)写出252525-25 的原码、反码、补码(以一个字节来思考)

数值 原码 反码 补码
25 00011001
-25 10011001 11100110 11100111

(2)写出计算机中以10011111 (以一个字节为例)存储的二进制数对应的十进制是多少。 解题过程:

第一步:最高位是符号位为1,说明该数是负数。

第二步: 将补码转为反码 (补码-1) , 10011110 (反码)

第三步:将反码转为原码(符号位不变,其余位取反),

1110000111100001(原码)

第四步:最前面1代表负数,后面11000011100001的十进制数是:64+32+1=9764+32+1=97

∴ 答案是97-97