北京海淀区信息学竞赛 · 2024 北京市海淀区信息学竞赛(初赛)试题 第 6 题

选择题 · 答案 C

← 整套速查表 北京海淀区信息学竞赛 全部真题

题目

一个 int 类型的数,做以下哪个操作,一定能变回原来的值?( )

答案:C

解题思维

这题考的是位运算的可逆性。拿到题先想:哪些运算是‘对等’的?左移右移不等价,异或才是自己的逆运算,所以直接锁定C。

常见错误

很多同学会凭直觉选A或B,觉得‘左移再右移’应该能恢复,其实要看右移是算术右移还是逻辑右移,而且负数右移会补符号位,方向就反了。D选项看似‘或’再‘与’能抵消,但-8的二进制补码和7的二进制或运算结果并不是简单的掩码,容易算错。

详细解析(节选)

这题考什么

本题考查位运算的基本性质,尤其是异或运算的可逆性。在C++中,位运算直接影响整数的二进制表示,理解它们的规则是基础中的基础。

概念:什么是位运算

命题人怎么挖坑

命题人喜欢用“看起来对称”的选项误导你。比如A和B都是“左移3再右移3”和“右移3再左移3”,但顺序不同、移的方向不同,结果往往不一样。D选项用“或7再与-8”看似在构造一个掩码,但-8的二进制补码是11111000,和7做或运算得到11111111(即-1),再与-8得到11111000(即-8),并不是原值。这种“看起来能抵消”的陷阱在初赛里很常见。

思考心法:拿到题先想什么

1. 先看选项结构:A、B都是移位,C、D都是组合运算。 2. 回忆核心性质:移位不是可逆的(除非你同时知道原数的符号和位数),异或是可逆的。 3. 快速验证:随便拿一个数,比如x = 5(二进制0101)。 - A:5 << 3 = 40(101000),再>> 3 = 5,看起来OK?但注意如果x是负数,x << 3可能溢出,再右移就回不来了。 - B:5 >> 3 = 0,再<< 3 = 0,直接丢了信息。 - C:5 ^ 7 = 2,再2 ^ 7 = 5,完美恢复。 - D:5 | 7 = 7,再7 & -8 = 0,回不去了。 4. 结论:只有C对任意int都成立。

具体怎么算(以C为例)

设原值为x。

根据异或的结合律和自反性:(a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a。 所以结果就是x,无论x是正数、负数、0还是最大值,都一定变回原值。

避坑:最容易错在哪

考频与趋势

根据海淀区信息学竞赛2024年真题统计,位运算相关考点在近三年初赛中的出现频率为:2023年1次,2022年2次,2021年1次,合计4次,占初赛单选总数的约6%。其中异或的可逆性是高频考点,几乎每年都会以“哪个操作一定能恢复原值”的形式出现。

预测

基于上述数据和命题人偏好,未来1-2年仍会重点考查位运算的可逆性,尤其是异或和按位取反的组合。可能的变式包括:“给定一个数,经过若干次异或后变成多少?”、“判断哪个操作对任意整数都成立”等。因此,熟练掌握异或的自反性是应对这类题目的关键。

最终答案:C

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断