对应大纲: 2.1.5-1(进制与进制转换)、2.1.5-5(ASCII 码)、2.1.2-4(位运算)、2.1.2-2(基本数据类型)
⚠️ 进制题出现在 19 套真题的 19 套里——一套不落。 这是初赛第一高频考点,本章必须吃透。
📝 S1_位运算与进制.md
讲的是复赛怎么用位运算;本章讲的是初赛怎么考。两份互补,都要看。
| 位置 | 第4位 | 第3位 | 第2位 | 第1位 |
|---|---|---|---|---|
| 二进制 | 8 | 4 | 2 | 1 |
| 八进制 | 512 | 64 | 8 | 1 |
| 十六进制 | 4096 | 256 | 16 | 1 |
十六进制的字母:
1101 0110 1011 → 十六进制 D 6 B
110 101 101 011 → 八进制 6 5 5 3
📝 这就是十六进制流行的原因:一位十六进制正好等于四位二进制。
小数点右边的权是 :
📝 背这三个:,,。
① 混进制运算,一律先全部转成十进制再算,最后再转回题目要的进制。
CSP 2024 第 2 题: → ✓
② 选项进制各不相同时,把选项也全转成十进制再比。
CSP 2019 第 9 题:。 选项 、、、 ✓
③ 在原进制下直接做竖式加法,务必逐位算完再看选项。
CSP 2023 第 2 题:(不是 )——四个选项只差最后两位。
计算机里的负数用补码存储。
对 8 位为例,:
原码 1000 0101 (最高位是符号位,1 表示负)
反码 1111 1010 (符号位不变,其余取反)
补码 1111 1011 (反码 + 1) ← 实际存的是这个
📝 正数的原码 = 反码 = 补码。 只有负数要变。
| 类型 | 位数 | 范围 |
|---|---|---|
char |
8 | |
short |
16 | |
int |
32 | |
unsigned int |
32 | |
long long |
64 | 约 |
⚠️ 负数比正数多一个(因为 占了正数那侧的一个位置)。口诀:负的那头是整的(),正的那头减一()。
📝
两个近似值背下来:(int
上限)、(unsigned
上限)。
⚠️ 溢出:int
存不下就会「绕回去」。。看到
a * b 且
都上万,先想会不会溢出。
只背三个基准值,其余全靠加减:
| 常用推论 | 值 |
|---|---|
'a' - 'A' |
32(大小写差 32) |
'9' |
|
'Z' |
|
'z' |
|
| 数字字符转数字 | c - '0' |
| 小写转大写 | c - 'a' + 'A',或 c - 32 |
📝 ASCII 表的顺序:数字 < 大写字母 <
小写字母。 所以 'A' < 'a' 成立。
⚠️ (char)('a' + 13) 是什么? $97 + 13 =
110 = $ 'n'(CSP 2024 第 8
题)。用码值算,别数字母——数字母最容易差一。
⚠️ char
在常见平台上是有符号的,(char)0xff 是
不是
。CSP
2021 第 17 题就考了这个(table 初始化成
0xff,输出 int(table[0]) 得
)。
⚠️ cout << 一个 char
打印的是字符不是数字。 要按数字打印必须写
cout << (int)c。CSP 2022 第 16 题就靠这个把「short
改成 char」变成了错误选项。
| 运算 | 符号 | 规则 |
|---|---|---|
| 与 | & |
两位都是 1 才得 1 |
| 或 | | |
有一个 1 就得 1 |
| 异或 | ^ |
不同得 1,相同得 0 |
| 取反 | ~ |
0 ↔︎ 1(含符号位) |
| 左移 | << |
x << k =
|
| 右移 | >> |
x >> k =
|
| 写法 | 作用 | 例子 |
|---|---|---|
x & (x - 1) |
抹掉最低位的那个 1 | |
x & (-x) |
取出最低位的那个 1 | |
x & 1 |
判奇偶(为 1 则奇数) |
📝 由此推出两个高频结论:
x & (x-1) == 0 ⟺
是 2 的幂(只有一个 1)x &= x - 1 直到
,做的次数
=
的二进制里 1 的个数(popcount)⚠️ CSP 2021 第 16
题整道题就是这两个套路:f(x) 数 1
的个数、g(x) 取
lowbit。认出来这题就秒了。
📝 所以**「一堆数里只有一个出现奇数次,其余都出现偶数次」→ 全部异或起来就是答案。**
| 坑 | 说明 |
|---|---|
不能用 == 比较 |
不一定精确等于
。要写
fabs(a-b) < 1e-9 |
| 精度 | float 约 7 位有效数字,double 约 15
位。竞赛一律用 double |
| 除法 | int / int
是整除!7 / 2 = 3。要小数必须
7.0 / 2 |
| NaN | 负数开根号得 nan,不是数字也不会报错 |
⚠️ CSP 2022 第 18 题:(ans * ans == n)
这个浮点相等判断,
不是完全平方数时永远为 0,迭代再多次也没用。
⚠️ CSP 2023 第 16 题:输入 1 1 5
这种构不成三角形的边长,海伦公式里根号内是负数,实测输出
nan——所以「程序总是输出四位小数」是错的。
📝 浮点数的乘法交换顺序会改变二进制位(CSP 2023 第
16
题实测:
的全部三元组里有 142190 组的 double
结果不完全相同),但保留 4
位小数后看不出差别。这个细节值得记住。
int 的范围是多少?为什么负数比正数多一个?'0'、'A'、'a' 的 ASCII
码各是多少?x & (x-1) 和 x & (-x)
分别是干什么的?if (a == b) 比较两个
double?x & (x-1) == 0(且
)fabs(a-b) < 1e-9