近3年初赛考察:
题号 | 题型 | 分值 | |
---|---|---|---|
2020 | 第9题 | 单项选择 | 2分 |
2021 | 第3题 |
难易度:中等
计算机使用二进制,每一位上的数字由0和1组成。
为什么计算机选择二进制
1.很难在一种物质上体现十种不同的状态,即使表示出来也很容易出错。
2.电线的高、低电平(电压)表示两种状态非常方便,并且不容易出错。
二进制下的加减运算
二进制的加减法与十进制类似,加法时:十进制为逢十进一,二进制是逢二进一;减法时:十进制是借一当十,二进制是借一当二。

1.二进制数 00100100 和 00010100 的和是( )。
A.00101000 B.01100111 C.01000100 D.00111000
2.在二进制下,1011001 + ( ) =1100110。
A. 1011 B. 1101 C. 1010 D. 1111
十进制和二进制下的加、减法有什么不同呢?
进位不同 逢十进一、逢二进 ..一

借位不同 借一当十、借一当二

十进制转二进制
整数部分短除法、小数部分短乘法

二进制转十进制
每位数字乘以它的权重累加到一起。
**1.**如何计算权重 二进制位权为2^{(数位-1)}2(数位−1)
**2.**如何转换十进制 sum += a[i] * w


原码、反码和补码
机器数
与普通二进制数不同,最高位作为符号位,1表示负数,0表示正数,其余位数表示真值。
原码
原码就是用第一位表示符号,其余位表示值。比如如果是8位二进制:

反码
反码的表示方法是:
正数的反码是其本身。
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

补码
补码的表示方法是:
正数的补码就是其本身。
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)

既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?
电脑计算减法是转换成加法进行计算,且符号位参与到运算中。 但是:

所以为了解决减法转换加法错误的问题,反码出现了。 但是:

为了解决-0的问题,出现了补码。并且把-0的编码作为数字范围内的最小值,所以数字范围增加了1个。****
8位机器数能表示的数据范围: -128 ~ 127
32位机器数能表示的数据范围: -2147483648 ~ 2147483647
1.二进制数 1011 转换成十进制数是( ).
A. 11 B. 10 C. 13 D. 12
2.目前主流的计算机储存数据最终都是转换成( )数据进行储存。
A.二进制 B.十进制 C.八进制 D.十六进制
3.在二进制下,1011001+()=1100110。
A. 1011 B. 1101 C. 1010 D. 1111
4.二进制数 00100100 和 00010101 的和是( )。
A. 00101000 B. 001010100 C. 01000101 D. 00111001
5.二进制数 00100100 和 00010100 的和是( )。
A.00101000 B.01100111 C.01000100 D.00111000
6.二进制数 00101100 和 00010101 的和( ).
A. 00101000 B. 01000001 C. 01000100 D. 00111000
7.在 8 位二进制补码中,10101011 表示的数是十进制下的( ).
A. 43 B. -85 C. -43 D. -84
8.二进制数 11.01 在十进制下是( ).
A. 3.25 B. 4.125 C. 6.25 D. 11.125
9.二进制数101.11对应的十进制数是( )。
A.6.5 B.5.5 C.5.75 D.5.25
10.十进制小数 13.375 对应的二进制数是( )。
A. 1101.011 B. 1011.011 C. 1101.101 D. 1010.01
11.一个自然数在十进制下有n位,则它在二进制下的位数与( )最接近。

进制转换
近3年初赛考察:
题号 | 题型 | 分值 | |
---|---|---|---|
2020 | 第17题 | 阅读程序 | 13.5分 |
第13题 | 单项选择 | 2分 |
难易度:中等
不同的进制
在计算机中,除二进制外,比较常用的还有八进制和十六进制。
进制 | 基数 | 进位原则 | 基本符号 |
---|---|---|---|
二进制(B) | 2 | 逢2进1 | 0,1 |
八进制(O) | 8 | 逢8进1 | 0~7 |
十进制(D) | 10 | 逢10进1 | 0~9 |
十六进制(H) | 16 | 逢16进1 | 0~ 9,A ~ F |
Warning!
易错点:十六进制中的 A相当于十进制中的 1010。
进制转换
1. 十进制转化成K进制
(1)整数部分
短除法,除K取余,直到商是00,余数从下到上输出,即为K进制的整数部分。
例:十进制199199转化成八进制

(2)小数部分
乘K取整,直到小数部分是00或达到指定精度,整数部分从上到下输出,即为K进制的小数部分。
例:十进制0.31250.3125转化成八进制

Warning!
绝大部分浮点数无法用二进制精确表示,如 0.1。
2. K****进制转化成十进制
每一位上的数字乘以对应的位权,整数部分位权是K^(数位−1),小数部分的权分别为K^-1、K^-2 …
千位 | 百位 | 十位 | 个位 | . | 十分位 | 百分位 | |
---|---|---|---|---|---|---|---|
数字 | 22 | 00 | 33 | 22 | . | 11 | 22 |
位权 | K^3 | K^2 | K^1 | K^0 | K^-1 | K^-2 |
例:八进制2032.122032.12转换成十进制

负数次幂

3. 二、八、十六进制之间的转换
一个八进制位可以用 3 个二进制位来表示(2^3 = 8),一个十六进制位可以用 4个二进制位来表示(2^4 = 16),反之同理。
十进制 | 二进制 | 八进制 | 十六进制 | 十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|---|---|---|---|
0 | 8 | 1000 | 10 | 8 | |||
1 | 9 | 1001 | 11 | 9 | |||
2 | 10 | 2 | 10 | 1010 | 12 | A | |
3 | 11 | 3 | 11 | 1011 | 13 | B | |
4 | 100 | 4 | 12 | 1100 | 14 | C | |
5 | 101 | 5 | 13 | 1101 | 15 | D | |
6 | 110 | 6 | 14 | 1110 | 16 | E | |
7 | 111 | 7 | 15 | 1111 | 17 | F |
例:

程序实现将n进制数转换成m进制。
//将n进制数字num,转换成m进制数
//(其中2 <= n,m <= 16,n进制数对应的十进制的值不超过int范围)
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
string num;
cin >> n >> num >> m;
//n进制num转换成十进制数ans
int ans = 0, w = 1;
int len = num.length();
for (int i = len - 1; i >= 0; i--){
if ('A' <= num[i] && num[i] <= 'F'){
ans = ans + (num[i] - 'A' + 10) \* w;
} else {
ans = ans + (num[i] - '0') \* w;
}
w \*= n;
}
//十进制数ans转换成m进制
char mnum[100] = {}, cnt = 0;
while (ans != 0){
int tmp = ans % m;
if (tmp >= 10){
mnum[cnt++] = tmp - 10 + 'A';
}else{
mnum[cnt++] = tmp + '0';
}
ans /= m;
}
for (int i = cnt - 1; i >= 0; i--){
cout << mnum[i];
}
return 0; }
练习题目:
#include <iostream>
using namespace std;
long long n, ans;
int k, len;
long long d[1000000];
int main() {
cin >> n >> k;
d[0] = 0;
len= 1;
ans = 0;
for (long long i = 0; i <n; ++i) {
++d[0];
for (int j = 0; j + 1<len; ++j) {
if (d[j] == k) {
d[j] = 0;
d[j + 1] += 1;
++ans;
}
}
if (d[len - 1] == k) {
d[len - 1] = 0;
d[len] =1;
++len;
++ans;
}
}
cout << ans << endl;
return 0; }
假设输入的 n 是不超过 2^62的正整数,k都是不超过 10000 的正整数,完成下面的判断题和单选题:
•判断题 1)若 k=1,则输出 ans 时,len=n。( ) 2)若 k>1,则输出 ans时,len—定小于 n。( ) 3)若 k>1,则输出 ans时,k^len—定大于n。( )
•单选题 4)若输入的 n 等于:10^15,输入的 k为 1,则输出等于( )。 5)若输入的 n 等于205,891,132,094,649(即 3^30),输入的 k为 3,则输出等于( )。 6)若输入的 n 等于 100,010,002,000,090,输入的 k为 10,则输出等于( )。 1. A. 正确 B. 错误 2. A. 正确 B. 错误 3. A. 正确 B. 错误 4.  5.  6. A. 11,112,222,444,543 B. 11,122,222,444,453 C. 11,122,222,444,543 D. 11,112,222,444,453
1.八进制数 32.1 对应的十进制数是( )。
A. 6.5 B. 5.5 C. 5.75 D. 5.25
2.二进制数101.11对应的十进制数是( )。
A.6.5 B.5.5 C.5.75 D.5.25
3.十进制小数 13.375 对应的二进制数是( )。
A. 1101.011 B. 1011.011 C. 1101.101 D. 1010.01
4.下列四个不同进制的数中,与其它三项数值上不相等的是( )。
A. (269)16 B. (617)10 C. (1151)8 D.(1001101011)2
位运算
近3年初赛考察:
题号 | 题型 | 分值 | |
---|---|---|---|
2021 | 第16题第3、4、5、6小题 | 阅读程序 | 7.5分 |
第17题 | 14分 | ||
2022 | 第16题第3、4、5小题 | 4.5分 |
难易度:中等
2023年备考建议
站在出题人的视角,位运算在普及组也是属于不是很容易在复赛中考察的内容,但是放在初赛的阅读程序中却能很方便的提高区分度,即会位运算和不会的。也能通过位运算的考察,来考察学生对于二进制的理解,又很容易和编解码这类题做结合,简直不要太方便。所以命题者爱出,就要求大家掌握得很牢固。
除了位运算的一般用法,还要求掌握一些位运算的经典用法,比如lowbit运算,这样考场见到不用现场算,现场总结规律,就会得心应手。
作用于整数类型的运算对象,对二进制数位进行运算。
位与:& 当且仅当两个运算对象都为1时,该位为1
1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
eg: 255 & 128 = 128

位或:| 当且仅当两个运算对象都为0时,该位为0
1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0
eg: 255 | 128 = 255

位取反:~ 将1置为0,将0置为1
~ 1 = 0 ~ 0 = 1
eg: ~ 128 = 127

位异或:^ 当且仅当两个运算对象中只一个为1时,该位为1
1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0
eg: 255 ^ 128 = 127

**左移: **<<
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
左边二进制位丢弃不包括1时, 左移1位相当于乘以2****。
eg: **3 << 2 = 12 (1100) **
**右移: **>>
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃.
右移1位相当于除以2****(整数除法)。
eg: 7 >> 1 变成 3,也就是111 >> 1 变成了 11。
18^125^125=()
A.127
B.143
C.18
D.125
位运算的性质
x ^ x = 0 : 自己与自己做异或一定为0
x ^ 0 = x : 一个数与0做异或还是它本身
位运算的应用:
Info
位运算的应用较多,写法种类也有多种。下面的应用,建议大家只是在本地都要运行一遍,加深记忆。
此外考场上难免会有不知道的位运算应用,这个时候,手算,对比,找规律,就是最好的方式。
取末位(x & 1) 可用来判断奇数、偶数
操作x的第j位(从右向左数,最右边是第0位)
x