


第1题:原码、反码、补码
题目问:
关于计算机的数据编码,下面说法不正确的是哪一个?
选项:
-
A. 数字 5,不管采用原码、反码、补码,它的 8 位二进制形式都是
(0000 0101)₂ -
B. 计算机科学中,单位换算默认 1KB = 1024B,而非 1000B
-
C. 原码是最直观的一种有符号数表示方法
-
D. 反码运算中,最高位进位要抛掉
答案:D
一、先认识"原码"
计算机表示一个有正有负的整数时,需要解决一个问题:
"这个数字到底是正数还是负数?"
最简单的办法就是:
最高位专门当符号位。
例如 8 位:
0 0000101
↑
符号位
最高位:
0 → 正数
1 → 负数
所以:
+5 = 00000101
而 -5 的原码:
10000101
二、什么是反码?
对于正数:
原码 = 反码 = 补码
例如:
+5
原码:00000101
反码:00000101
补码:00000101
但是负数就不一样了。
-5:
+5:
00000101
把每一位反过来:
11111010
这就是 -5 的反码。
然后再加 1:
11111010
+1
--------
11111011
这就是 -5 的补码。
三、A为什么正确?
A说:
数字 5,不管采用原码、反码、补码,它的 8 位二进制形式都是
00000101。
因为:
5 是正数
所以:
原码 = 反码 = 补码
因此 A 正确。
四、B为什么正确?
计算机中传统上:
1 KB = 1024 B
所以 B 在本题语境下正确。
五、C为什么正确?
原码非常直观:
最高位看正负
后面的位表示数值
所以它确实是比较容易理解的一种有符号数表示方法。
六、D为什么错误?
这是本题真正的陷阱!
题目说:
反码运算中,最高位进位要抛掉。
不对!
反码加法有一个非常特别的规则:
⭐ 最高位产生进位时,要把这个进位"绕回来",加到最低位。
也叫:
循环进位 / 端回进位
例如:
1111
+
0001
----
10000
最高位多出来一个 1。
普通情况下可能觉得:
"扔掉!"
但反码运算:
0000
+
0001
----
0001
所以:
❌ 最高位进位直接扔掉
✅ 最高位进位要加回最低位
🧠 小学生记忆口诀
反码进位不丢掉,绕一圈回来再加好!
第2题:进制转换
题目问:
关于进制转换,下面说法不正确的是哪一个?
答案:D 。试卷中给出的四个选项涉及 1101B、42Q、2BEH 和 345Q = 0E3H 等表示。
一、先认识三个常见进制
二进制
只有:
0、1
例如:
1011
八进制
有:
0~7
例如:
345Q
其中 Q 表示八进制。
十六进制
有:
0~9
A~F
其中:
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
所以:
2BEH
实际上是十六进制。
二、A为什么正确?
1101B
这是二进制。
从右往左:
1 1 0 1
对应:
2³ 2² 2¹ 2⁰
所以:
1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1
= 13
所以:
1101B = 13
正确。
三、B为什么正确?
42Q 是八进制。
42Q
就是:
4×8¹ + 2×8⁰
所以:
4×8 + 2
= 32 + 2
= 34
正确。
四、C为什么正确?
2BEH
是十六进制。
注意:
B = 11
E = 14
所以:
2BEH
= 2×16² + 11×16¹ + 14×16⁰
计算:
2×256 = 512
11×16 = 176
14×1 = 14
因此:
512 + 176 + 14
= 702
所以 C 正确。
五、D为什么错误?
这是一个非常适合考试时检查的方法:
八进制 → 二进制
一个八进制数字对应 3位二进制。
例如:
3 → 011
4 → 100
5 → 101
所以:
345Q
转换成二进制:
3 4 5
011 100 101
即:
011100101
而十六进制:
E = 1110
3 = 0011
所以:
E3H
=
1110 0011
显然:
011100101
和
11100011
不一样。
因此:
345Q ≠ E3H
D 错误。
🧠 三级考试非常重要的口诀
八进制一位管3个二进制位。
十六进制一位管4个二进制位。
这两个口诀一定要熟。
第3题:for循环里的"小陷阱"
题目程序:
#include <iostream>
using namespace std;
int main() {
int x = 1;
for (int i = 0; i = 0; i <= 5) {
x++;
}
cout << x << endl;
return 0;
}
答案:A,1。原题程序和选项见试卷。
一、很多同学第一眼会这样想
看到:
for (int i = 0; i = 0; i <= 5)
可能会想:
i从0开始
i<=5
所以循环6次
但是------
❌ 错了!
因为这里不是:
i == 0
而是:
i = 0
二、= 和 == 完全不同
这是 C++ 初学者必须牢记的一对兄弟。
=
叫:
赋值
例如:
i = 0;
意思:
把 0 放进 i 这个盒子。
==
叫:
判断是否相等
例如:
i == 0
意思:
i里面是不是0?
三、那么 i = 0 的结果是什么?
看:
i = 0
它做两件事:
第一步:
i变成0
第二步:
整个表达式的值就是
0
所以:
if (i = 0)
实际上相当于:
if (0)
而 C++ 中:
0 → 假
非0 → 真
所以循环条件一开始就是:
假
四、循环一次都没有执行
程序:
int x = 1;
所以:
x = 1
然后进入:
for (...)
条件:
i = 0
结果:
0
即:
false
因此:
x++;
一次都没有执行。
最后:
cout << x;
输出:
1
⭐ 考试陷阱
看到:
if (a = 0)
不要慌。
一定要问自己:
这里是
=还是==?
🧠 口诀
一个等号:往盒子里放东西。
两个等号:检查两个东西是不是一样。
第4题:补码
题目问:
关于计算机编码中补码,下面说法错误的是哪一个?
答案:C。原题四个选项包括正数补码、负数补码、8位补码范围和负数补码的另一种求法。
A:正确
正数的补码:与其原码、反码相同。
例如:
+5
原码:00000101
反码:00000101
补码:00000101
所以正确。
B:正确
负数的补码:将对应正数的原码按位取反,然后加1。
例如:
求 -5:
第一步
+5 = 00000101
第二步:全部取反
11111010
第三步:加1
11111010
+ 1
---------
11111011
所以:
-5的补码 = 11111011
正确。
C:错误
题目说:
8位补码,最大表示数据是128,最小表示数据是-128。
这里最大值错了。
8位补码范围是:
-128 ~ 127
而不是:
-128 ~ 128
为什么?
8个二进制位一共有:
2⁸ = 256
种组合。
补码把它们分配给:
-128 ~ 127
一共正好:
256个数
D:为什么正确?
还有一种很方便的求负数补码方法:
例如:
+5 = 00000101
从右往左:
00000101
↑
遇到第一个 1 后:
这个1以及右边保持不变,左边全部取反。
于是:
00000101
变成:
11111011
就是 -5 的补码。
🧠 口诀
求负数补码:右边找到第一个1,1和右边不动,左边全部反。
第5题:神奇的 x & (x - 1)
程序:
int x = 2026;
int count = 0;
while (x > 0) {
count++;
x = x & (x - 1);
}
cout << count << endl;
答案:B,8。
这道题是前7题里非常重要的一题。
一、x & (x-1)到底在干什么?
它有一个非常神奇的作用:
⭐ 把 x 的二进制中最右边的那个
1消掉。
例如:
x = 12
二进制:
1100
那么:
x - 1 = 1011
进行 &:
1100
& 1011
------
1000
最右边那个 1:
1100
↑
消失了!
二、那么2026有几个1?
我们把2026拆成二进制:
2026
= 1024 + 512 + 256 + 128 + 64 + 32 + 8 + 2
所以:
2026
=
11111101010₂
数一数:
11111101010
^^^^^^ ^ ^
一共有:
8个1
三、程序到底做了什么?
第一次:
2026
→ 消掉一个1
第二次:
→ 再消掉一个1
......
直到:
0
需要多少次?
答案就是:
原来有多少个二进制的
1。
2026有8个1。
所以:
count = 8
答案:
B
四、这是一条超级重要的算法
以后看到:
while (x > 0) {
x = x & (x - 1);
}
脑袋里应该马上蹦出:
🚨 "它在一个一个消灭二进制中的1!"
因此:
int count = 0;
while (x > 0) {
count++;
x = x & (x - 1);
}
就是:
统计一个整数二进制中有多少个1。
第6题:位运算判断题
题目问:
关于位运算,下列说法错误的是?
答案:C 。题目四个选项涉及异或找唯一数、左移溢出、带符号整数左移溢出,以及二进制末两位为 00 的倍数关系。
我们逐个看。
A:异或找唯一数------正确
例如:
5 7 9 7 5
其中:
5出现两次
7出现两次
9出现一次
利用异或:
5 ^ 7 ^ 9 ^ 7 ^ 5
异或有一个超级重要的性质:
a ^ a = 0
并且:
a ^ 0 = a
所以:
5 ^ 5 = 0
7 ^ 7 = 0
最后:
0 ^ 0 ^ 9 = 9
所以:
A正确。
B:左移可能溢出------正确
例如:
int x = 1;
x = x << 30;
不断左移,相当于把二进制中的数字向左搬。
通常情况下:
x << 1
可以理解成:
x × 2
但是如果已经超过了数据类型能够表示的范围,就可能发生溢出。
所以:
不能无条件认为左移永远等于乘2。
B正确。
C:错误
题目说:
有符号整数左移溢出时结果确定。
这是错误的。
为什么?
因为一旦发生有符号整数溢出,就不能再简单地说:
"结果一定就是某一个固定的数学值。"
考试中看到:
"溢出后结果一定......"
"任何情况下都一定......"
这类绝对化表述要特别警惕。
所以:
C错误。
D:为什么正确?
题目说:
一个二进制数最后两位是
00,一定是4的倍数。
例如:
1100
最后两位:
00
对应:
4的倍数
因为二进制最后两位相当于:
2¹
2⁰
如果都是0,就没有:
2
1
这两个部分。
因此这个数一定能被:
4
整除。
例如:
100
= 4
1000
= 8
1100
= 12
10000
= 16
最后两位全部是:
00
🧠 位运算四兄弟
这道题结束后,小朋友一定要记住:
| 运算 | 可以想象成 |
|---|---|
& |
两个人都同意才为1 |
| ` | ` |
^ |
不一样才为1 |
~ |
全部反过来 |
其中:
a ^ a = 0
a ^ 0 = a
非常重要。
第7题:综合位运算
题目:
3 & 7 | 15 ^ ~11
其中:
a=3
b=7
c=15
d=11
答案:D,-5。
这道题看起来很可怕,其实只要:
先搞清楚优先级,再一步一步算。
一、先记住位运算优先级
这里涉及:
&
|
^
~
其中:
~ 最高
&
^
|
所以:
3 & 7 | 15 ^ ~11
应该理解成:
(3 & 7) | (15 ^ (~11))
二、先算 3 & 7
把它们写成二进制:
3 = 0011
7 = 0111
进行 &:
0011
& 0111
------
0011
所以:
3 & 7 = 3
三、计算 ~11
这里是本题最容易出错的地方。
在 C++ 中,~ 是:
按位取反
对于有符号整数,通常要按照整数的补码形式理解。
例如:
11
可以写成:
00000000 00000000 00000000 00001011
取反:
11111111 11111111 11111111 11110100
这个结果在补码中表示:
-12
所以:
~11 = -12
还有一个非常好用的公式:
⭐
~x = -x - 1
所以:
~11
= -11 - 1
= -12
四、计算 15 ^ ~11
因为:
~11 = -12
所以:
15 ^ (-12)
这里可以利用:
~11 = -12
并且:
15 = 000...01111
-12 = 111...10100
异或:
000...01111
111...10100
-------------
111...11011
这个补码表示:
-5
所以:
15 ^ ~11 = -5
五、最后别忘了最左边的 |
原式:
3 & 7 | 15 ^ ~11
现在:
3 & 7 = 3
以及:
15 ^ ~11 = -5
所以:
3 | (-5)
结果仍然是:
-5
因此:
✅ 答案 D:-5
为什么 3 | (-5)还是 -5?
用补码看:
-5 = 11111111 11111111 11111111 11111011
而:
3 = 00000000 00000000 00000000 00000011
进行 |:
11111111 11111111 11111111 11111011
00000000 00000000 00000000 00000011
---------------------------------------
11111111 11111111 11111111 11111011
还是:
-5
所以答案:
D
🌟 1~7题,知识总结
| 题号 | 核心知识 | 答案 |
|---|---|---|
| 1 | 原码、反码 | D |
| 2 | 二进制、八进制、十六进制 | D |
| 3 | = 与 ==、for循环 |
A |
| 4 | 补码与表示范围 | C |
| 5 | x & (x-1) |
B |
| 6 | 位运算性质、溢出 | C |
| 7 | `& | ^ ~`综合运算 |
⭐ 最后给大家一张"必背卡"
① 原码、反码、补码
正数:
原码 = 反码 = 补码
负数补码:
正数原码
→ 全部取反
→ +1
或者:
从右往左找到第一个1
这个1和右边不动
左边全部取反
② 8位补码范围
-128 ~ 127
千万不要写成:
-128 ~ 128
③ 进制转换
二进制:0、1
八进制:0~7
十六进制:0~9、A~F
口诀:
八进制一位 = 二进制3位
十六进制一位 = 二进制4位
④ C++中的两个等号兄弟
a = b;
是:
赋值
a == b
是:
比较是否相等
特别注意:
if (x = 0)
条件是:
假
⑤ x & (x-1)
看到:
x = x & (x - 1);
马上想到:
🪄 消灭二进制中最右边的一个1!
所以:
while (x) {
count++;
x = x & (x - 1);
}
就是:
数一个整数的二进制里面有多少个1。
⑥ 异或 ^
最重要的两个:
a ^ a = 0
a ^ 0 = a
所以:
5 ^ 7 ^ 9 ^ 7 ^ 5
重复出现的:
5、5
7、7
全部消失,最后留下:
9
⑦ ~
一定要记:
~x = -x - 1
例如:
~11 = -12
~5 = -6
~0 = -1





