在 C++ 语言(洛谷注:竞赛环境是 C++14 语言标准)中,所有 int 类型的值,经过若干次左移操作(<<)后,它们的值总会变为 0。
这题考C++位运算里左移的本质。拿到题先想:左移是把二进制位整体往高权值方向挪,低位补0,数值只会变大或溢出,绝不会自动归零。
很多同学把‘左移’和‘右移’搞混,或者死记‘左移是乘2’就以为无限左移最终会清空。其实int是有固定位宽的,左移只会让高位挤出数据,低位补0,数值要么变大要么溢出,不会变成0。
【考点】二进制表示|左移运算|int类型范围
【概念人话版】 在C++里,int是固定位宽(通常32位)的整数。左移运算符<<的含义非常直观:把操作数的二进制位整体向高权值方向移动,空出来的低位全部补0。比如x << 1,相当于把x乘以2,但前提是x的位宽够。如果x已经是很大的正数,再左移一位,最高位挤出数据,数值反而可能变小(因为溢出),甚至变成负数(如果符号位被挤进去)。
【命题人怎么挖坑】 这道题的陷阱就在于‘总会变为0’这个绝对化表述。命题人故意利用初学者对‘移位’的模糊直觉——以为‘移出去就没了,移进来的都是0’,从而误以为无论怎么左移,最终都会清空所有位变成0。实际上,左移只会改变位的排列顺序,不会消除所有有效位。除非你左移的位数超过了int的位宽(比如x << 32),否则结果绝不会是0。
【思考心法】 拿到这种‘总会/一定’的判断题,第一步要否定它:有没有反例?
1,左移1位得2,再左移1位得4……越移越大,离0越来越远。-1(二进制全1),左移1位得-2(符号位不变,数值位左移,低位补0),再左移得-4……也是越来越‘负’,不会变0。INT_MAX,左移1位会变成INT_MIN(溢出),再左移又变回正数……依然不是0。所以‘总会变为0’显然不成立。
【避坑提醒】
【考频与趋势】 结合题库数据:
【预测】 基于以上数据,未来GESP三级及更高阶考试中,位运算相关题目(尤其是左移、右移、按位与/或/异或)的考查频率大概率会继续上升,甚至可能成为必考内容。命题人可能会在更复杂的场景下(如结合循环、条件判断、数组下标等)考察位运算的实际应用,而不仅仅是概念辨析。因此,建议同学们不仅要掌握左移的本质,还要多练习组合场景下的位运算题目,以应对未来考题的深化与拓展。