全国青少年CSP-J编程竞赛真题解析(2025版)
上QQ阅读APP看书,第一时间看更新

1.3 数据表示与计算

数据表示与计算的主要内容如图1.8所示。

图1.8

1.3.1 数制转换

数制也称计数制,是用一组固定的符号和统一的规则来表示数值的方法。日常生活中最常用的是十进制,而在计算机中,多采用二进制,有时也采用八进制和十六进制。

1.3.2 进位计数制

进位计数制简称进位制,是按进位方式实现计数的一种规则,其特点是数码的数值大小与它所在的位置有关。每一数位的数值是由该位数码的值乘以处在该位的一个固定常数,这个常数称为位权或权值。例如,在十进制中,个位的位权是100,十位的位权是101,百位的位权是102,以此类推。

十进制:是基数为10的数制,它有0~9共10个数码,进位规则是“逢10进1”。

二进制:是基数为2的数制,它只有0和1两个数码,进位规则是“逢2进1”。

八进制:是基数为8的数制,它有0~7共8个数码,进位规则是“逢8进1”。

十六进制:是基数为16的数制,有0~9和A、B、C、D、E、F共16个数码,其中A~F代表的数值依次是10~15,进位规则是“逢16进1”。

1. 常用数制的书写方式

为了区分不同的数制,我们可以采用以下两种方式表示。

(1)字母表示法:可在数据后面加一个特定的字母来表示它所采用的进制。通常以字母B表示二进制、字母O表示八进制、字母D表示十进制、字母H表示十六进制。例如,11B(二进制)、11O(八进制)、11D(十进制)、11H(十六进制)。

(2)下标表示法:在数据的右下角加上相应进制的基数。例如,(11)2、(11)8、(11)10、(11)16

2. 不同进制之间的转换

(1)非十进制数转换十进制数:将非十进制数按位权展开,求出各位数值之和,就可以得到对应的十进制数。

【示例】请将二进制数(1011.01)2转换成十进制数。

【解答】按位权展开:(1011.01)2=1 × 23+ 0 × 22+ 1 × 21+ 1 × 20+ 0 × 2-1+ 1 × 2-2=8 + 2 + 1 + 0.25=(11.25)10

(2)十进制数转换非十进制(R进制)数:将十进制数的整数部分和小数部分分别转换成R进制数,再把结果合并起来,就可以得到对应的R进制数。其中十进制数的整数部分采用“除基取余法”进行转换,小数部分采用“乘基取整法”进行转换。

整数部分的转换——除基(R)取余法:除基取余法是用十进制数除以目的数制的基数R,所得余数作为最低位,把得到的商再除以R,所得余数作为次低位,以此类推,直至商为0时,所得余数作为最高位。

【示例】请将十进制数(29)10转换为二进制数。

【解答】把(29)10转换为二进制数,逐次除以2取余数:

  然后,从下往上写出余数,就可以得到(29)10 = (11101)2

小数部分的转换——乘基(R)取整法:乘基取整法是用目的数制的基数R乘以十进制数,对于第一次相乘得到的结果,将整数部分作为最高位,把结果的小数部分再乘以R,所得结果的整数部分作为次高位,以此类推,直至小数部分为0,或者达到要求的精度为止。

【示例】将十进制数(0.625)10转换为二进制数。

【解答】把(0.625)10 转换为二进制数,逐次乘以2取整:

然后,依次写出整数,可以得到(0.625)10 = (0.101)2

注意,若要把十进制数(29.625)10 转换成二进制数,只需要把上面求出的整数部分和小数部分合并起来,可以得到(29.625)10 = (11101.101)2

3. 二、八、十六进制数的互相转换

(1)二进制数和八进制数之间的转换:由于八进制数的基数8=23,因此3位二进制数可以构成1位八进制数。如果要将二进制数转换成八进制数,只需要将二进制数的整数部分自右向左每3位一组,最后一组不足3位时以0补足;小数部分自左向右每3位一组,最后一组不足3位时以0补齐;再把每组对应的八进制数写出即可。

【示例】将二进制数(1100110.0101)2转换为八进制数。

【解答】按照上述方法分组:

由此可知,(1100110.0101)2=(146.24)8

反之,如果要将八进制数转换成二进制数,只要将每1位八进制数写成3位二进制数,再按顺序排列起来即可。

(2)二进制数和十六进制数之间的转换:由于十六进制数的基数16=24,因此4位二进制数可以构成1位十六进制数。如果要将二进制数转换成十六进制数,只需要将二进制数的整数部分自右向左每4位一组,最后一组不足4位时以0补足;小数部分自左向右每4位一组,最后一组不足4位时以0补齐;再把每组对应的十六进制数写出即可。

【示例】将二进制数(1100110.10101)2转换为十六进制数。

【解答】按照上述方法分组:

由此可知,(1100110.10101)2=(66.A8)16

反之,如果要将十六进制数转换成二进制数,只要将每1位十六进制数写成4位二进制数,再按顺序排列起来即可。

(3)八进制数和十六进制数之间的转换:八进制数和十六进制数之间的转换以二进制数为桥梁,先转换为二进制数,再将二进制数转换为相应的进制数。

【示例】将八进制数(57.16)8转换为十六进制数。

【解答】先转换成二进制数:

再转换成十六进制数:

由此可知,(57.16)8=(101111.00111)2=(2F.38)16

1.3.3 原码、反码与补码

在计算机中,正数和负数的表示方法是:把一个数的最高位作为符号位,用“0”表示“正”,用“1”表示“负”,数值位连同符号位一起作为一个数,称为机器数。带符号位的机器数对应的数值称为机器数的真值。例如,正数X=+1101011,负数Y=-1101011,表示成机器数就是X=01101011,Y=11101011。原码、反码和补码是计算机存储具体数字时常用的三种机器数。

1. 原码

原码是符号位加上真值的绝对值,最高位表示符号,其余位表示真值的绝对值。

【示例】以8位二进制数举例,+1和-1的原码分别如下:

[+1]=[00000001],[-1]=[10000001]

2. 反码

正数的反码就是原码,负数的反码是在原码的基础上符号位不变,其余各位取反。

【示例】以8位二进制数举例,+1和-1的反码可用如下过程表示出来:

[+1]=[00000001]=[00000001]

[-1]=[10000001]=[11111110]

如果一个反码表示的是负数,可以先转换成原码,然后再看它的真值是多少。

3. 补码

正数的补码就是原码,负数的补码是在原码的基础上符号位不变,其余各位取反,最后+1,也就是在反码的基础上+1。

【示例】以8位二进制数举例,+1和-1的补码可用如下过程表示出来:

[+1]=[00000001]=[00000001]=[00000001]

[-1]=[10000001]=[11111110]=[11111111]

如果一个补码表示的是负数,可以将其先转换成反码,再转换成原码,然后看它的真值是多少。也可以使用这样的规则进行转换:符号位不变,其他位取反,然后再+1。

【示例】以8位二进制数举例,补码11110001所表示的真值推导方法如下:

[11110001]=[10001110+1]=[10001111],所以[11110001]表示的真值是-15。

1.3.4 真题解析

1. 【2019年第2题】二进制数11101110010111和01011011101011进行逻辑与运算的结果是(  )。

A. 01001010001011

B. 01001010010011

C. 01001010000001

D. 01001010000011

【解析】两个二进制数进行逻辑与运算的规则:依次计算每一个二进制位,如果两个数相同位上的数字都是1,则这一位的结果为1,否则结果为0。本题的运算见表1.4。

表1.4

【答案】D

2. 【2020年第9题】二进制数1011 转换成十进制数是(  )。

A. 11

B. 10

C. 13

D. 12

【解析】将二进制数中的每一位数码与其相对应的位权相乘后再相加:23+21+20=8+2+1=11。

【答案】A

3. 【2021年第7题】二进制数101.11对应的十进制数是(  )。

A. 6.5

B. 5.5

C. 5.75

D. 5.25

【解析】将二进制数中的每一位数码与其相对应的位权相乘后再相加:

1×22+ 0×21+1×20+1×2-1+1×2-2=5.75

【答案】C

4. 【2022年第13题】八进制数32.1对应的十进制数是(  )。

A. 24.125

B. 24.250

C. 26.125

D. 26.250

【解析】将八进制数中的每一位数码与其相对应的位权相乘后再相加:

3×81+2×80+ 1×8-1=26.125

【答案】C

5. 【2023年第2题】 八进制数123456708和076543218的和为(  )。

A. 222222218

B. 211111118

C. 221111118

D. 222222118

【解析】八进制数的加法规则是“逢8进1”,注意保持对齐计算。

【答案】D

6. 【2023 年第 9 题】数1010102和1668的和为(  )。

A. 101100002

B. 2368

C. 15810

D. A016

【解析】本题考查的是“进制转换”这一知识点。就本题来说,解题过程如下。

(1)将二进制数101010转换为十进制得到42,将八进制数166转换为十进制得到118。

(2)两数相加得到160,转换为十六进制,得到A016

【答案】D

7. 【2024年第2题】计算(148-10102)×D16-11012的结果,并选择答案的十进制值:(  )

A. 13

B. 14

C. 15

D. 16

【解析】本题考查的是“进制转换”这一知识点。就本题来说,原式化成十进制后为(12-10)×13-13,计算后得13。

【答案】A

1.3.5 习题

1. 以下哪一项是二进制数10010010对应的十进制数?(  )

A. 73

B. 96

C. 122

D. 146

【解析】二进制数10010010对应的十进制数为27+24+21=146。

【答案】D

2. 以下哪一项是十进制数109对应的二进制数?(  )

A. 1100101

B. 1100111

C. 1101001

D. 1101101

【解析】本题的运算详见表1.5。十进制数109对应的二进制数为1101101。

表1.5

【答案】D

3. 以下哪一项是八进制数2330对应的十六进制数?(  )

A. 230

B. 3EB

C. 4D8

D. 4E0

【解析】八进制数转十六进制数,可以先将八进制数的每一位转换成3个二进制位,再将二进制数的每4位转换成一个十六进制位,即八进制数2 3 3 0=二进制数10 011 011 000=二进制数100 1101 1000=十六进制数4D8。

【答案】C

4. 整数56的八位补码是(  )。

A. 01001000

B. 01011100

C. 00111000

D. 11100011

【解析】因为非负整数的原码=反码=补码,所以56的八位补码是00111000。

【答案】C

5. 八位补码10100110对应的十进制整数是(  )。

A. -11

B. 37

C. -37

D. -90

【解析】该补码符号位为1,可以确定是一个负数。对于负数来说,通过补码(10100110)→反码(10100101)→原码(11011010)的方式,再计算真值的绝对值(1011010)2得到其对应的十进制数是90,最后添加上负号就是-90。

【答案】D